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