モデルの構築と評価
Datawhaleコミュニティ実践データ分析第3章 モデル構築と評価の学習記録
- モデル構築
- データ部門
train_test_split()
- モデルの選択とデータのフィッティング
- モデルのインスタンス化、
fit()
- モデルのインスタンス化、
- 予測する
predict()
predict_proba()
- データ部門
- モデルの評価
- 相互検証
cross_val_score()
cross_val_predict()
- 混同行列
cofusion_matrix()
classification_report()
、、、、precision_score()
_recall_score()
_f1_score()
precision_recall_curve()
- ROC曲線
roc_curve()
roc_auc_score()
- 相互検証
第 3 章 モデルの構築と評価 – モデリング
タイタニック号のデータセットがあるので、今回の目標はタイタニック号の生存を予測するタスクを完了することです。
import pandas as pd
import numpy as np
%matplotlib inline
私たちが提供したクリーンアップされたデータ (clear_data.csv) を読み込み、皆さんも元のデータ (train.csv) を読み込み、その違いについて話し合います
#写入代码
orgin_data = pd.read_csv('train.csv')
orgin_data.head(3)
乗客ID | 生き残った | Pクラス | 名前 | セックス | 年 | シブスプ | 尊敬 | チケット | 運賃 | キャビン | 乗り出しました | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | ブラウン、オーウェン・ハリス氏 | 男 | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | カミングス、ジョン・ブラッドリー夫人 (フローレンス・ブリッグス・... | 女性 | 38.0 | 1 | 0 | PC17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | ヘイキネンさん、ローン | 女性 | 26.0 | 0 | 0 | ストン/O2。3101282 | 7.9250 | NaN | S |
#写入代码
clean_data = pd.read_csv('clear_data.csv')
clean_data.head(3)
乗客ID | Pクラス | 年 | シブスプ | 尊敬 | 運賃 | 性別女性 | 性別男性 | 乗り出した_C | 乗り出した_Q | 乗り出した_S | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | 22.0 | 1 | 0 | 7.2500 | 0 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 38.0 | 1 | 0 | 71.2833 | 1 | 0 | 1 | 0 | 0 |
2 | 2 | 3 | 26.0 | 0 | 0 | 7.9250 | 1 | 0 | 0 | 0 | 1 |
#違う
- 削除された
Survived
機能 (分離されたラベル) - テキスト機能をワンホット エンコーディングに
Sex
変換するEmbarked
Name
元のデータの、Ticket
、Cabin
フィーチャを削除しました
モデル構築
- 前のデータを処理した後、モデリング データを取得します。次のステップは、適切なモデルを選択することです。
- モデルを選択する前に、データセットが最終的に教師ありか教師なしかを知る必要があります。
- モデルの選択は、一方では私たちのタスクによって決まります。
- タスクに応じてモデルを選択することに加えて、データのサンプル サイズと特徴の疎さに従って決定することもできます。
- 最初は常に基本モデルをベースラインとして使用しようとし、次に比較のために他のモデルをトレーニングし、最終的により優れた汎化能力またはパフォーマンスを持つモデルを選択します。
[考え方] データをフィッティングする際に、データセットのどの違いによってモデルが変化するのか
#考え方answer
サンプル数、特徴量、特徴量の重要度、サンプル分布間のギャップ、ノイズなど。
タスク 1: トレーニング セットとテスト セットをカットする
ここでは、データセットがホールドアウト法を使用して分割されています
- データセットを独立変数と従属変数に分割する
- トレーニング セットとテスト セットを比例的に削減します (一般的なテスト セットの割合は 30%、25%、20%、15%、10%)
- 層別サンプリングを使用する
- 再現可能な結果を得るためにランダム シードを設定する
【考える】
- データセットを分割するにはどのような方法がありますか?
- 層化サンプリングを使用する理由とその利点は何ですか?
#考える
- データセットを分割する方法
- 取り置き方法
- ランダムなパーティション
- 層化抽出法
- K分割交差検証
- 自助
- 層化サンプリングにより、分割されたデータは元のデータの分布を維持できます。
タスクのヒント 1
- データセットを切り出す目的は、将来のモデルの汎化能力を評価することです。
- sklearnで設定したデータを切り出す方法は、
train_test_split
- 関数のドキュメントを表示するには、jupyter noteboo でそれを使用し、
train_test_split?
Enter キーを押して表示します。 - 階層的シードとランダムなシードがパラメータにあります
clear_data.csv および train.csv から train_test_split() を抽出するために必要なパラメータ
#写入代码
X = clean_data
y = orgin_data.Survived
#写入代码
from sklearn.model_selection import train_test_split
#写入代码
?train_test_split
#写入代码
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
((712, 11), (179, 11), (712,), (179,))
【考える】
- データセットを切り取るときにランダムに選択する必要がないのはどのような状況ですか?
#思考回答
1. 数据集非常大,随机划分即可能浪费大量时间,也可能降低准确率
2. 时序数据,采用分段切割,避免数据泄露
3. 数据类别不平衡,会采用重采样
タスク 2: モデルの作成
- 線形モデル (ロジスティック回帰) に基づいて分類モデルを作成する
- ツリーベースの分類モデル (デシジョン ツリー、ランダム フォレスト) を作成する
- これらのモデルをそれぞれトレーニング セットとテスト セットのスコアに使用してトレーニングします。
- モデルのパラメータを表示し、パラメータ値を変更してモデルの変化を観察します
ヒント
- ロジスティック回帰は回帰モデルではなく分類モデルであるため、
LinearRegression
混同しないでください。 - ランダム フォレストは、実際には決定木の過剰適合を軽減するための決定木アンサンブルです。
- 線形モデルが配置されているモジュールは次のとおりです。
sklearn.linear_model
- ツリーモデルが配置されているモジュールは次のとおりです。
sklearn.ensemble
#写入代码
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
#写入代码
lr = LogisticRegression(max_iter=3000)
lr.fit(X_train, y_train)
lr.get_params()
{'C': 1.0,
'class_weight': None,
'dual': False,
'fit_intercept': True,
'intercept_scaling': 1,
'l1_ratio': None,
'max_iter': 3000,
'multi_class': 'auto',
'n_jobs': None,
'penalty': 'l2',
'random_state': None,
'solver': 'lbfgs',
'tol': 0.0001,
'verbose': 0,
'warm_start': False}
#写入代码 查看训练集和测试集的得分
print("Training set score: {:.2f} ,Testing set score: {:.2f}".format(lr.score(X_train, y_train), lr.score(X_test, y_test)))
Training set score: 0.81 ,Testing set score: 0.80
#写入代码
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
rfc.get_params()
{'bootstrap': True,
'ccp_alpha': 0.0,
'class_weight': None,
'criterion': 'gini',
'max_depth': None,
'max_features': 'auto',
'max_leaf_nodes': None,
'max_samples': None,
'min_impurity_decrease': 0.0,
'min_impurity_split': None,
'min_samples_leaf': 1,
'min_samples_split': 2,
'min_weight_fraction_leaf': 0.0,
'n_estimators': 100,
'n_jobs': None,
'oob_score': False,
'random_state': None,
'verbose': 0,
'warm_start': False}
#写入代码 查看训练集和测试集的得分
print("Training set score: {:.2f} ,Testing set score: {:.2f}".format(rfc.score(X_train, y_train), rfc.score(X_test, y_test)))
Training set score: 1.00 ,Testing set score: 0.82
【考える】
- 線形モデルが分類タスクを実行できる理由とその背後にある数学的関係は何ですか
- 多分類問題の場合、線形モデルはどのように分類するか
#答えを考える
- 入力特徴を使用して加重合計s = w T xs = w^Txを計算します。s=wT x を取得し、分類用の活性化関数を使用して 0 と 1 の間でマッピングします。
- 複数の二項分類問題に変換可能
タスク 3: モデルの予測結果を出力する
- 出力モデルの予測された分類ラベル
- さまざまなクラスラベルの予測確率を出力する
ヒント 3
- 一般的な監視モデルには sklearn に
predict
予測ラベルがあり、predict_proba
ラベル確率を出力できます。
#写入代码
pred = lr.predict(X_test)
pred[:5]
array([0, 0, 0, 0, 1], dtype=int64)
#写入代码
pred_proba = lr.predict_proba(X_test)
pred_proba[:5]
array([[0.92961653, 0.07038347],
[0.95523041, 0.04476959],
[0.8395754 , 0.1604246 ],
[0.96137521, 0.03862479],
[0.34067921, 0.65932079]])
【考える】
- ラベルの確率を予測することはどのように役立ちますか
#思考回答
获取模型对预测结果的确信程度
第 3 章 モデルの構築と評価 - 評価
前のモデルのモデリングに従って、sklearn ライブラリを使用してモデリングを完了する方法や、データセットの分割などがわかりました。では、モデルが有用かどうかをどうやって判断するのでしょうか? モデルから得られる結果を安全に使用できるようにするには? そうすれば、今日の学習の評価が非常に役立ちます。
次のライブラリをロードします
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from IPython.display import Image
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6) # 设置输出图片大小
タスク: データをロードし、テスト セットとトレーニング セットを分割する
#写入代码
data = pd.read_csv('clear_data.csv')
train = pd.read_csv('train.csv')
X = data
y = train['Survived']
from sklearn.model_selection import train_test_split
#写入代码
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
#写入代码
lr = LogisticRegression(max_iter=1000)
lr.fit(X_train, y_train)
LogisticRegression(max_iter=1000)
モデルの評価
モデルの評価とは、モデルの汎化能力を知ることです。
- K 分割交差検証 (k 分割交差検証)
- 混同行列 (confusion_matrix)
- 精度(精度)
- 再現率(再現率)
- F1スコア
- ROC曲線
タスク 1: 相互検証
- 10 分割交差検証を使用して以前のロジスティック回帰モデルを評価する
- 相互検証精度の平均を計算する
#提示:交叉验证
Image('Snipaste_2020-01-05_16-37-56.png')
ヒント 4
- sklearn の相互検証のモジュールは次のとおりです。
sklearn.model_selection
#载入模块
from sklearn.model_selection import cross_val_score
#K折交叉验证
lr = LogisticRegression(C=100, max_iter=1000)
scores = cross_val_score(lr, X_train, y_train, cv=10)
scores
array([0.8358209 , 0.7761194 , 0.82089552, 0.80597015, 0.85074627,
0.86567164, 0.73134328, 0.85074627, 0.75757576, 0.6969697 ])
#获取K折平均值
print("Average cross-validation score: {:.2f}".format(scores.mean()))
Average cross-validation score: 0.80
思考4
- k倍が増えるとどのような影響が出るのでしょうか?
#思考回答
增加了计算开销
タスク 2: 混同マトリックス
- 二項分類問題の混同行列を計算する
- 適合率、再現率、f スコアを計算する
【思考】二項分類問題の混同行列とは? この概念を理解し、主にどのような用途に使用されるかを知る。
#思考回答
混淆矩阵用于评估分类器性能,其总体思路就是统计A类别实例被分成为B类别的次数
混淆矩阵中的行表示实际类别,列表示预测类别
#提示:混淆矩阵
Image('Snipaste_2020-01-05_16-38-26.png')
#提示:准确率 (Accuracy),精确度(Precision),Recall,f-分数计算方法
Image('Snipaste_2020-01-05_16-39-27.png')
ヒント 5
- 混同行列の手法はsklearnの
sklearn.metrics
モジュールです - 混同行列には実際のラベルと予測ラベルを入力する必要があります
- 精度、再現率、および f スコアが利用可能な
classification_report
モジュール
#写入代码
from sklearn.metrics import confusion_matrix
#写入代码
lr = LogisticRegression(C=100, max_iter=500)
lr.fit(X_train, y_train)
LogisticRegression(C=100, max_iter=500)
#写入代码
pred = lr.predict(X_train)
#写入代码
confusion_matrix(y_train, pred)
array([[350, 62],
[ 71, 185]], dtype=int64)
from sklearn.metrics import classification_report
print(classification_report(y_train, pred))
precision recall f1-score support
0 0.83 0.85 0.84 412
1 0.75 0.72 0.74 256
accuracy 0.80 668
macro avg 0.79 0.79 0.79 668
weighted avg 0.80 0.80 0.80 668
【考える】
- 混同行列を自分で実装するときは何に注意すべきですか?
#思考回答
混淆矩阵中每个值代表的含义和位置,即 TN,FP,FN,TP。
PR曲線を描く
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_test, lr.decision_function(X_test))
plt.plot(precisions, recalls)
plt.xlabel("precision")
plt.ylabel("recall")
plt.grid();
def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
plt.plot(thresholds, precisions[:-1], "b--", label="Precision")
plt.plot(thresholds, recalls[:-1], "g-", label="Recall")
plt.legend(loc=0)
plt.xlabel("thresholds")
plt.grid()
plot_precision_recall_vs_threshold(precisions, recalls, thresholds);
タスク 3: ROC 曲線
- ROC曲線を描く
【考察】ROC曲線とは何か、ROC曲線はどのような問題を解決するために存在するのか?
#《机器学习实战》
**受试者工作特征曲线(简称ROC)**
绘制是真正类率(召回率,灵敏度)和假正类率(FPR)关系。
FPR是被错误分为正类的负类实例比率。它等于1减去真负类率(TNR),后者是被正确分类为负类的负类实例比率,也称为特异度。
**ROC曲线和PR曲线的选取:**
一个经验法则是,当正类非常少见或者你更关注假正类而不是假负类时,应该选择PR曲线,反之则是ROC曲线。
ヒント 6
- sklearn の ROC 曲線のモジュールは次のとおりです。
sklearn.metrics
- ROC 曲線の下に囲まれた領域が大きいほど、良好な結果が得られます。
#写入代码
from sklearn.metrics import roc_curve
#写入代码
fpr, tpr, thresholds = roc_curve(y_test, lr.decision_function(X_test))
plt.plot(fpr, tpr, label="ROC Curve")
plt.xlabel("FPR")
plt.ylabel("TPR (recall)")
plt.grid();
考える6
- 多分類問題のROC曲線の描き方
#思考回答
绘制每个类别的ROC曲线
【考察】 このROC曲線からどのような情報が得られるでしょうか?この情報で何ができるのでしょうか?
#思考回答
ROC曲线下面积,用来指导模型选择。
[注]個人の学習記録のみ。
詳細については、Datawhale コミュニティ オープンソース コースの実践的なデータ分析を参照してください。