適合率-再現率曲線では、同じ点が異なる座標軸でプロットされます。警告: 左側の最初の赤い点 (再現率 0%、精度 100%) は 0 ルールに対応します。左側の 2 番目のドットが最初のルール、というように続きます。
Skope-rules はツリー モデルを使用してルール候補を生成します。まず、いくつかのデシジョン ツリーを構築し、ルート ノードから内部ノードまたはリーフ ノードまでのパスをルール候補として検討します。これらの候補ルールは、適合率や再現率などの事前定義された基準によってフィルタリングされます。精度と再現率がしきい値を超えるものだけが保持されます。最後に、類似性フィルタリングを適用して、十分な多様性を持つルールを選択します。一般に、スコープ ルールは、各根本原因の基礎となるルールを学習するために適用されます。
プロジェクト アドレス: https://github.com/scikit-learn-contrib/skope-rules
スキーマ
pipを使用して最新のリソースを取得できます:
pip install skope-rules
SkopeRules は、論理ルールを使用してクラスを記述するために使用できます。
from sklearn.datasets import load_iris
from skrules import SkopeRules
dataset =load_iris()
feature_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
clf = SkopeRules(max_ Depth_duplicatinotallow=2,
n_estimators=30,
precision_min=0.3 ,
recall_min=0.1,
feature_names=feature_names)
for idx、enumerate(dataset.target_names) の種:
X、y = dataset.data、データセット。 target
clf.fit(X, y == idx)
rules = clf.rules_[0:3]
print("アヤメのルール", Species)
ルール内のルール:
print(ルール)
print()
print(20*'=')
print()
次のエラーが表示される場合:
Python インポート エラーについて: 名前 'six' を 'sklearn.externals' からインポートできませんYun Duojun on Stack Overflow で同様の質問が見つかりました: https://stackoverflow.com/questions/61867945/
解決策は次のとおりです
import six
import sys
sys.modules['sklearn .externals.six'] = six
import mlrose
SkopeRules は、「score_top_rules」メソッドを使用する場合、予測子としても使用できます。
from sklearn.datasets import load_boston
from sklearn.metrics import precision_recall_curve
from matplotlib import pyplot as plt
from skrules import SkopeRules
dataset =load_boston()
clf = SkopeRules(max_ Depth_duplicatinotallow=None,
n_estimators=30,
precision_min=0.2,
remember_min=0.01 ,
feature_names=dataset.feature_names)
XX, y = dataset.data, dataset.target > 25
X_train, y_train = X[:len(y)//2], y [:len(y)//2]
#X_test, y_test = X[len(y)//2:], y[len(y)//2:]
clf.fit(X_train, y_train )
y_score = clf.score_top_rules(X_test) # 各テスト例のリスク スコアを取得します
precision, recall, _ = precision_recall_curve(y_test, y_score)
plt.plot(recall, precision)
plt.xlabel('リコール')
plt.ylabel('精度')
plt.title('精度リコール曲線')
plt.show()
このケースでは、有名なタイタニック号のデータ セットに対するスコープ ルールの使用を示します。
スコープルールの適用性:
from skrules import SkopeRules
# ライブラリのインポート
import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier、RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve、precision_recall_curve
from matplotlib import cm
import numpy as np
from sklearn.metrics import infection_matrix
from IPython.display import display
# タイタニック号のデータをインポート
data = pd.read_csv('../ data/titanic-train.csv')
データ準備
data = data.query('Age == Age')
# は変数 Sex はエンコードされた値
data['is Female'] = (data['Sex'] == '女性') * 1
# 変数 Embarked はエンコードされた値
data = pd を作成します。 concat(
[data,
pd.get_dummies(data.loc[:,'Embarked'],
dummy_na=False,
prefix='Embarked',
prefix_sep='_' )],
axis=1
)
# 未使用の変数を削除
data = data.drop(['Name', 'Ticket', 'Cabin',
'PassengerId', ' Sex ', 'Embarked'],
axis = 1)
# トレーニング セットとテスト セットを作成します
XX_train, X_test, y_train, y_test = train_test_split(
data.drop(['Survived'], axis =1)、
data['Survived']、
test_size=0.25、random_state=42)
feature_names = X_train.columns
print('列名は次のとおりです: ' ' ' . join(feature_names.tolist()) '.')
print('トレーニング セットの形状は次のとおりです: ' str(X_train.shape) '.')
列名は次のとおりです: Pclass Age SibSp Parch料金
is Female Embarked_C Embarked_Q Embarked_S.
トレーニング セットの形状: (535, 9).
モデル トレーニング
gradient_boost_clf = GradientBoostingClassifier(random_state=42, n_estimators=30, max_ Depth = 5)
gradient_boost_clf.fit(X_train, y_train)
# ベンチマーク用のランダム フォレスト分類器をトレーニングする
random_forest_clf = RandomForestClassifier(random_state= 42、n_estimators=30、max_ Depth = 5)
random_forest_clf.fit(X_train, y_train)
# ベンチマーク用のデシジョン ツリー分類器をトレーニングする
decion_tree_clf = DecisionTreeClassifier(random_state=42, max_ Depth = 5)
decion_tree_clf.fit(X_train, y_train)
# skope-rules ブースティング分類器をトレーニングする
skope_rules_clf = SkopeRules(feature_names=feature_names, random_state= 42, n_estimators=30,
remember_min= 0.05, precision_min=0.9,
max_samples=0.7,
max_ Depth_duplicatinotallow= 4, max_ Depth = 5)
skope_rules_clf.fit(X_train, y_train)
# 予測スコアの計算
gradient_boost_scoring = gradient_boost_clf.predict_proba(X_test)[:, 1]
random_forest_scoring = random_forest_clf.predict_proba(X_test)[:, 1]
decion_tree_scoring = Decision_tree_clf.predict_proba( X_test)[:, 1]
skope_rules_scoring = skope_rules_clf.score_top_rules(X_test)
「生存ルール」の抽出
print("SkopeRules で作成" str(len( skope_rules_clf.rules_)) "rules n")
# Print these rules
rules_explanations = [
"3 歳未満および 37 歳未満、第 1 クラスまたは第 2 クラスの女性。 "
"1 等または 2 等で旅行し、26 ユーロ以上を支払う 3 歳以上の女性。 "
"1 等または 2 等で旅行し、29 ユーロ以上支払う女性。 "
"1 等または 2 等で旅行する 39 歳以上の女性。 "
]
print('最も優れた 4 つの「タイタニック生存ルール」は次のとおりです:/n')
for i_rule, rules in enumerate(skope_rules_clf.rules_[:4] )
print(rule[0])
print('->' rules_explanations[i_rule] 'n')
9 個のルールが SkopeRules を使用して作成されました。
そのうち上位 4 個は "タイタニック サバイバル ルール」は次のとおりです:
年齢 2.5
および Pclass 0.5
-> 3 歳未満の女性および37 歳未満、1 等または 2 等
年齢 > 2.5、運賃 > 26.125
、Pclass 0.5
-> 3 歳以上の女性1 等または 2 等で旅行し、26 ユーロ以上支払う老人。
運賃 > 29.356250762939453
and Pclass 0.5
-> 1 等または 2 等に乗車し、29 ユーロ以上支払う女性。
年齢 > 38.5 かつ Pclass and is女性 > 0.5
-> 39 歳以上で、1 等または 2 等で旅行する女性。
def compute_y_pred_from_query(X, ルール):
score = np.zeros(X.shape[0])#XX = X.reset_index(drop=True)
score[list( X.query(rule).index)] = 1
return(score)
def compute_performances_from_y_pred(y_true, y_pred,index_name='default_index'):
df = pd.DataFrame(data=
{
'精度':[sum(y_true * y_pred)/sum(y_pred)],
'再現率':[sum(y_true * y_pred)/sum(y_true)]
},
index=[index_name],
columns=['precision', 'recall']
)
return(df)
def compute_train_test_query_performances(X_train, y_train, X_test, y_test) 、ルール):
y_train_pred = compute_y_pred_from_query(X_train, ルール)
y_test_pred = compute_y_pred_from_query(X_test, ルール)
パフォーマンス = なし
パフォーマンス = pd.concat([
パフォーマンス,
compute_パフォーマンス_from_y_pred(y_train, y_train_pred, 'train_set')],
axis=0)
パフォーマンス = pd.concat([
パフォーマンス,
compute_performances_from_y_pred(y_test, y_test_pred, ' test_set')],
axis=0)
return(パフォーマンス)
print('Precision = 0.96 は、ルールによって決定された人々の 96% が生存者であることを意味します。 ')
print('Recall = 0.12 は、ルールによって特定された生存者が生存者の総数 n の 12% を占めることを意味します')
for i in range(4):
print ('ルール ' str (i 1) ':')
display(compute_train_test_query_performances(X_train, y_train,#XX_test, y_test,
skope_rules_clf.rules_[i][0])
)
精度 = 0.96 は、ルールによって決定された人々の 96% が生存者であることを意味します。 Recall = 0.12 は、ルールによって特定された生存者が全生存者の 12% を占めることを意味します。
モデル パフォーマンスの検出
labels_with_points=['skope-rules']):
gradient = np.linspace(0, 1, 10)
color_list = [ cm .tab10(x) for x (勾配の x ) ]
fig, axes = plt.subplots(1, 2, figsize=(12, 5),
sharex=True, sharey=True)
ax = axes[0]
n_line = 0
i_score、enumerate(scores_with_line) のスコア:
n_line = n_line 1
fpr, tpr, _ = roc_curve(y_true, スコア)
ax.plot(fpr, tpr, linestyle='-.', c=color_list[i_score], lw=1, label=labels_with_line[i_score])
i_score の場合、enumerate(scores_with_points):
fpr のスコア、tpr、_ = roc_curve(y_true, スコア)
ax.scatter(fpr[:-1], tpr[:-1], c=color_list[n_line i_score], s=10, label=labels_with_points[i_score] )
ax.set_title("ROC", fnotallow=20)
ax.set_xlabel('偽陽性率', fnotallow=18)
ax.set_ylabel('真陽性率 (リコール)', fnotallow =18)
ax.legend(loc='下中央', fnotallow=8)
ax = axes[1]
n_line = 0
i_score の場合、enumerate のスコア(scores_with_line) ):
n_line = n_line 1
精度、リコール、_ = precision_recall_curve(y_true、スコア)
ax.step(リコール、精度、linestyle='-.'、c=color_list[i_score]、lw =1、where='post'、label=labels_with_line[i_score])
i_score の場合、enumerate(scores_with_points) のスコア:
precision、recall、_ = precision_recall_curve(y_true、score)
ax.scatter (リコール, 精度, c=color_list[n_line i_score], s=10, label=labels_with_points[i_score])
ax.set_title("精度-リコール", fnotallow=20)
ax.set_xlabel('リコール(真陽性率)', fnotallow=18)
ax.set_ylabel('精度', fnotallow=18)
ax.legend(loc='中央下', fnotallow=8)
plt.show ()
plot_titanic_scores(y_test,
scores_with_line=[gradient_boost_scoring,random_forest_scoring,decion_tree_scoring],
scores_with_points=[skope_rules_scoring]
)
##ROC 曲線上で、各赤い点は、(skope-rules からの) アクティブ化されたルールの数に対応します。たとえば、最低点は 1 つのルールの結果ポイント (最高) です。 2 番目に低いポイントは 2 ルール結果ポイント、以下同様です。
適合率-再現率曲線では、同じ点が異なる座標軸でプロットされます。警告: 左側の最初の赤い点 (再現率 0%、精度 100%) は 0 ルールに対応します。左側の 2 番目のドットが最初のルール、というように続きます。 この例からいくつかの結論を導き出すことができます。n_rule_chosen = 4
y_pred = skope_rules_clf.predict_top_rules(X_test, n_rule_chosen)
print('「 str(n_rule_chosen) 」で検出されたルールで到達したパフォーマンスは次のとおりです。 ')
compute_performances_from_y_pred(y_test, y_pred, 'test_set')
predict_top_rules(new_data, n_r) メソッドは、最初の n_r を含む new_data の予測を計算するために使用されます。アイテムのスコープルールルール。
以上が知識を増やしましょう!論理ルールを使用した機械学習の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。