1.親和性分析


-- coding: utf-8 --
“”"Created on Tue Sep 18 08:03:55 2018
@author:asus""#1親和性分析import numpy as np dataset_filename="affinity_dataset.txt"x=np.loadtxt(dataset_filename)
print(x[:5])
features = [‘bread’, ‘milk’, ‘cheese’, ‘apple’, ‘bananas’]
#取引データのsample[3]の値を判断することで、1人の顧客がアップルを買ったかどうかを知ることができます.num_apple_purchases = 0 for sample in x: if sample[3] == 1: num_apple_purchases += 1 print("{0} people bought Apple".format(num_apple_purchases))
#フィーチャー処理from collections import defaultdict valid_rules = defaultdict(int) invalid_rules = defaultdict(int) num_occurances = defaultdict(int)
for sample in x:for premise in range(4):#前提条件、顧客がある商品を購入したif sample[premise]==0:#個体がcontinue num_を満たすかどうかを検査するoccurances[premise]+=1#条件を満たし、出現回数に1 for conclusion in range(len(features)):#スキップ条件と結論が同じ場合if premise==conclusion:continue if sample[conclusion]==1:valid_rules[(premise,conclusion)]+=1#ルールの検証状況else:invalid_rules[(premise,conclusion)]+=1#違反規則状況
support = valid_rules#支持度confidence=defaultdict(float)#信頼度for premise,conclusion in valid_rules.keys(): rule = (premise, conclusion) confidence[rule] = valid_rules[rule]/num_occurances[premise]
#各ルールとそのサポートと信頼度def print_を出力rule(premise, conclusion, support, confidence, features): premise_name = features[premise] conclusion_name = features[conclusion] print(“rule: If a person buys {0} they will also buy {1}”.format( premise_name, conclusion_name)) print("- Support: {0}".format(support[(premise, conclusion)])) print("- Confidence: {0:.3f}".format(confidence[(premise, conclusion)]))
premise = 1 conclusion = 3 print_rule(premise, conclusion, support, confidence, features)
#1.3.5並べ替え最適なルールを見つけるfrom operator import itemgetter sorted_support=sorted(support.items()、key=itemgetter(1)、reverse=True)#itemgetter()クラスをキーとして使用すると、ネストリストをソートできます.itemgetter(1)は辞書の各要素の#値(ここでは支持度)を並べ替えの根拠とし、reverse=Trueは降順配列を表す
#出力支持度が最も高い上位5ルールfor index in range(5):print("Rule#{0}.format(index+1)))=sorted_support[index][0] print_rule(premise, conclusion, support, confidence, features)
#信頼度最高sorted_confidence = sorted(confidence.items(), key=itemgetter(1), reverse=True) for index in range(5): print(“Rule #{0}”.format(index + 1)) (premise, conclusion) = sorted_confidence[index][0] print_rule(premise, conclusion, support, confidence, features)
#1.5.1データセットの準備#分類、IRISデータセット
from sklearn.datasets import load_iris dataset = load_iris() x = dataset.data y = dataset.target print(dataset.DESCR)
#各フィーチャーの平均計算方法attribute_means=x.mean(axis=0)#連続したフィーチャー値を分散し、連続したフィーチャー値をカテゴリx_に変換d = np.array(x >= attribute_means, dtype=‘int’)
#1.5.2 OneRアルゴリズムを実装#既存のデータの中で、同じ特徴値を持つ個体が最もどのカテゴリに属する可能性が高いかに基づいて分類する.OneRはOne Rule(1つの規則)の略語であり、4つの特徴の中で分類効果が最も良いものだけを分類根拠として選択したことを示しています.from collections import defaultdict from operator import itemgetter#パラメータはそれぞれデータセット、カテゴリ配列、選択したフィーチャーインデックス値、フィーチャー値def train_feature_value(x,y_true,feature_index,value):"データセットの各データ(個体を表す)を巡回し、所与の特徴値を有する個体の各カテゴリにおける出現回数""class_を統計するcounts = defaultdict(int) for sample, y in zip(x, y_true): 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) predictors[current_value] = most_frequent_class errors.append(error) total_error = sum(errors) return predictors, total_error
#1.5.3テストアルゴリズム#データセットの関数from sklearn.cross_validation import train_test_split#この関数は、設定された割合(デフォルトではデータの25%をテストセットとする)に基づいて、テスト結果の信頼性を確保するために、データセットをランダムに2つの部分に分けます.xd_train, xd_test, y_train, y_test = train_test_split(x_d, y, random_state=14) #xd_trainトレーニングセット、xd_testテストセット.y_train,y_testは、それぞれ以上の2つのデータセットのカテゴリ情報である.
#トレーニングセットのみ使用します.データセットの各フィーチャーを巡回し、前に定義した関数train_を使用します.on_Feature()は#予測器を訓練し、誤り率を計算する.all_predictors = {} errors = {} for feature_index in range(xd_train.shape[1]): predictors, total_error = train_on_feature( xd_train, y_train, feature_index) all_predictors[feature_index] = predictors errors[feature_index] = total_Error#は、分類の唯一のルールとしてエラー率が最も低い特徴を見つけます.best_feature, best_error=sorted(errors.items()、key=itemgetter(1))[0]#予測器を並べ替え、最適な特徴値を見つけてmodelモデルを作成します.Model={‘variable’:best_feature,‘predictor’:all_predictors[best_feature]}#modelモデルは、分類のための特徴と予測器の2つの要素を含む辞書構造である.モデルがあれば、見たことのないデータを#フィーチャー値に基づいて分類できます.#variable = model[‘variable’] #predictor = model[‘predictor’] #prediction = predictor[int(sample[variable])]
def predict(x_test, model): variable = model[‘variable’] predictor = model[‘predictor’] y_prediction = np.array([predictor[int(sample[variable])] for sample in x_test]) return y_prediction
y_predicted=predict(xd_test,model)#予測結果と実際のカテゴリを比較することで、正解率がどれくらいなのかaccuracy=npが得られる.mean(y_predicted == y_test) * 100 print(“The test accuracy is {:.1f}%”.format(accuracy))