機械学習OneRアルゴリズム

13585 ワード

OneRアルゴリズム:1つの特徴を利用して分類を予測する
アルゴリズム思想:アルゴリズムはまず各特徴の各値を遍歴し、各特徴値に対して、各カテゴリでの出現回数を統計し、その出現回数が最も多いカテゴリを見つけ、他のカテゴリでの出現回数を統計する.すべてのフィーチャー値とそのカテゴリごとの出現回数を統計した後、各フィーチャーのエラー率を計算します.計算方法は,その各値の誤り率を加算し,誤り率が最も低い特徴を一意の分類準則(OneR)として次の分類に用いる.
アルゴリズムステップ:1.データセットの特徴値を0/1化処理(平均値以上、特徴値は1、そうでない場合は0)2.各特徴の各特徴値が各カテゴリに現れる回数を算出し、最も多い特徴値の誤判回数3を算出する.ある特徴の全ての特徴値の誤判回数を加算、誤判が最も低い特徴帰属組合せ及び総誤判回数4を探し出す.各特徴の合計のエラー回数の大きさを比較する、エラー回数が最も小さい特徴を探し出し、この特徴が最適な判断特徴5である.この特徴に対応する特徴値分類が最適分類規則である
例:
import numpy as np
from sklearn.datasets import load_iris
from collections import defaultdict
from operator import itemgetter
from sklearn.cross_validation import train_test_split

dataset = load_iris()

X=dataset.data
y=dataset.target

attribute_means=X.mean(axis=0)#     

#            0,        1
X_d=np.array(X >= attribute_means,dtype='int')


def train_feature_value(X,y_true,feature_index,value):
    class_counts=defaultdict(int)
    for sample,y in zip(X,y_true):
#        print(sample,y,feature_index)
#        print(sample[feature_index],value)
#        print('-----')
        if sample[feature_index]==value:
            class_counts[y]+=1
    
    sorted_class_counts=sorted(class_counts.items(),key=itemgetter(1),reverse=True)
    most_frequent_class=sorted_class_counts[0][0]

    incorrect_predictions=[class_count for class_value,class_count in class_counts.items() if class_value != most_frequent_class]
    error=sum(incorrect_predictions)

    return most_frequent_class,error
    
def train_on_feature(X,y_true,feature_index):
    #   
    values = set(X[:,feature_index])
    predictors = {}
    errors = []
    for current_value in values:
        most_frequent_class,error = train_feature_value(X,y_true,feature_index,current_value)
#        print(most_frequent_class,error)
#        print('---')
        predictors[current_value] = most_frequent_class
        errors.append(error)
        
    total_error = sum(errors)
#    print(predictors,errors,total_error)
    return predictors, total_error
    
    
Xd_train,Xd_test,y_train,y_test=train_test_split(X_d,y,random_state=None)
#random_state     ,        ,            
    
all_predictors = {}
errors = {}
for feature_index in range(Xd_train.shape[1]):
#    print(feature_index)  
    predictors,total_error = train_on_feature(Xd_train,y_train,feature_index)
#    print(predictors,total_error)
#    print('---')
    all_predictors[feature_index] = predictors
    errors[feature_index] = total_error
#print(all_predictors,errors)
best_feature,best_error = sorted(errors.items(),key=itemgetter(1))[0]
#print(best_feature,best_error)
model = {'feature':best_feature,'predictor':all_predictors[best_feature]}
#print(model)

def predict(X_test,model):
    variable = model['feature']
#    print(variable)
    predictor = model['predictor']
#    print(predictor)
    y_predicted = np.array([predictor[int(sample[variable])] for sample in X_test])
    return y_predicted
    
y_predicted = predict(Xd_test,model)
#print(y_predicted)
#print(y_test)
#     
accuracy = np.mean(y_predicted==y_test)*100
print("The test accuracy is {:.1f}%".format(accuracy))