取得したデータを実際に識別器にかけて分類するまでには、かなりの下処理が必要です
「機械学習の9割は前処理」という話がよく理解できました
よい分類精度を出すためにはいろいろ考慮しないといけません
そこでデータの取得から分類までの流れをまとめています(随時更新)
詳細はリンクを参考にしてください
1.データの取得
データといっても色々あります。
画像、音声、センサー出力、数値、文字(項目)などなど
そして、これらすべてのデータを数値、すなわちベクトル化する必要があります
2.特徴量抽出
特徴量抽出とはベクトル化することです
2-1.画像のベクトル化
2-2.文字のベクトル化
3.特徴量選択
すべてのデータが有効であるかといえば、そうでもありません
必要なデータ、いらないデータの取捨選択が必要です
特徴量選択の時に使うモジュールは、
from sklearn.feature_selection
にある
参考
特徴量選択について
sklearn.feature_selection による特徴量選択
3-1.SelectKBest
上位K個のベストな特徴量を選択する
引数score_func_
にはf_regression
(回帰)やchi2
(カイ二乗)の適用もできる
from sklearn.feature_selection import SelectKBest
#上位k個のベストな特徴量を選ぶ
from sklearn.feature_selection import chi2
#カイ二乗基準で
skb=SelectKBest(chi2, k=20)
skb=selectKBest(score_func=f_regression, k=5)
4.特徴量変換
4-1.主成分分析PCA
高次元データセットの可視化が可能
特徴量x1とx2に相関関係があれば、片方の特徴量はいらない = 冗長データ
処理の時間やメモリを圧迫するだけなので、特徴量の削減=次元削減がしたい
pca.explained_variance_ratio_
で寄与率を見ることで何次元減らせるか可視化できる
plt.plot(np.add.accumulate(pca.explained_variance_ratio_))
PCAを適用する前に、データをStandrdScaler
でスケール変換し、古語の特徴量の分散が1になるようにする
参考
意味がわかる主成分分析
主成分分析を Python で理解する
4-2. PCA Whitening 白色化
pca=PCA(whiten=True)
平均0、分散1にする
PCAによる変換後にStandardScaler
をかけるのと同義
4-3. ZCA Whitening
Deep-learningの画像認識によく使われる。
未勉強
4-4. 非線形(多項式)変換 PolynomialFeatures
これは多項式の特徴に変換するものです。すなわち次元増大ともいえる
次数degreeを選択することで、次元を増やせる
polf=PolynomialFeatures(degree=2) #次数を2にするとき
参考
Pythonでデータ分析:非線形効果を導入
scikit-learnで線形回帰
5. 正規化
スケールを同じにする。めっちゃ大事
参考
【Python】数量データの正規化 ( 標準化 ) について
sklearn StandardScaler で標準化の効果を確かめる-python
Python: データセットの標準化について
5-1 標準化 Standardization
from sklearn.preprocessing import StandardScaler
平均0、分散1にする
5-2 スケーリング Range Scaling
from sklearn.preprocessing import MinMaxScaler
mmscaler = MinMaxScaler([-1,1])
最小、最大値を定義してその範囲内のものだけ選択
5-3. 正規化 Normalization
from sklearn.preprocessing import Normalizer
normalizer=Normalizer()
.fitで学習する必要がない
ノルム(超訳:ベクトルの長さ)を1にする
うまくいかないことも多いらしく、工夫が必要
6. 学習データと検証用データに分割
参考
Python: パラメータ選択を伴う機械学習モデルの交差検証について
6.1 Hold-Out
データセットを学習用と検証用に分割し、学習用データを用いて識別器を学習させ、検証用データで性能評価する
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
shuffle=True,
random_state=1)
とか
from sklearn.model_selection import ShuffleSplit
ss=ShuffleSplit(n_splits=1,
test_size=0.5,
train_size=0.5,
random_state=0)
データをランダムに分けるだけなので、データに偏りが出る恐れがあるから注意!
6-2. Cross-Validation(交差検証)
Hold-Outのデータ偏り問題を解決するための方法で、データの分割を何度も繰り返して、複数のモデルを訓練する。
K-fold cross-validation(k分割交差検証)が一般的
from sklearn.model_selection import KFold
ss=KFold(n_splits=10,shuffle=True)
#kは基本5から10の範囲
6-3. Leave-One-Out
leave-one-out cross validation は、正解データから 1 つだけ抜き出してテストデータとし、残りのデータを教師データとして、交差検証を行う方法である。これを、全ての組み合わせについて、学習と評価を繰り返す。ちょうど、k-fold cross validation のとき、k をデータ数とした場合と同じ
from sklearn.model_selection import LeaveOneOut
loocv = LeaveOneOut()
参考
6-4. Leave-One-Group-Out
6-5. 層化Stratified
上の方法では各分割内でのクラスの比率がおかしくなることも
そこでStratify層化することでクラス内比率と全体の比率を同じにする
from sklearn.model_selection import StratifiedKFold
ss=StratifiedKFold(n_splits=10,shuffle=True)
参考
モデルの汎化性を評価する「交差検証」について、Pythonで学んでみた
7. 分類評価
7-1. Confusion Matrix
クラス分類を行った際の識別結果の精度を評価する方法。
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)
>>>array([[46, 1],
[ 4, 63]], dtype=int64)
参考
7-2.Accuracy Score
正解率 (Accuracy) は、「本来ポジティブに分類すべきアイテムをポジティブに分類し、本来ネガティブに分類すべきアイテムをネガティブに分類できた割合」を示す
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
>>>0.956140350877193
7-3. classification_report
precision(適合度・精度)、recall(再現率、感度)、f1-score(precisionとrecallの両方の総合評価)などを一括で出してくれる。
どのクラス分類がうまくいって、どこがうまくいってないのかわかる
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred, digits=4))
>>>
precision recall f1-score support
0 1.0000 1.0000 1.0000 27
1 0.8857 0.8857 0.8857 35
2 0.9714 0.9444 0.9577 36
3 0.9062 1.0000 0.9508 29
4 0.9677 1.0000 0.9836 30
5 0.9750 0.9750 0.9750 40
6 0.9773 0.9773 0.9773 44
7 1.0000 0.9487 0.9737 39
8 0.8750 0.8974 0.8861 39
9 0.9487 0.9024 0.9250 41
micro avg 0.9500 0.9500 0.9500 360
macro avg 0.9507 0.9531 0.9515 360
weighted avg 0.9509 0.9500 0.9500 360
どこの精度が悪いかすぐわかる。この場合クラス1,8の認識率が悪く改善が必要
7-4. ROC曲線、Area-Under-Curve(AUC)
モデル性能の評価指標として有名
from sklearn.metrics import roc_curve,
auc,
average_precision_score,
precision_recall_curve
test_score=clf.decision_function(X_test) #各予想のスコアを表す
fpr, tpr, th=roc_curve(y_test, test_score)
# FPR: false positive rate TPR:true positive rate
plt.plot(fpr, tpr)
print('AUC=', auc(fpr,tpr))
#AUC: Area Under Curve = rocカーブの下の部分の面積を表す。1に近いほど素晴らしい
plt.plot([0,1],[0,1], linestyle='--')
plt.xlim([-.01,1.01])
plt.xlabel('False Positive Rate (1-specificity)')
plt.ylabel('True Positive Rate (recall)')
x軸にFPR、y軸にTPRをとったグラフ
test_score=clf.decision_function(X_test) #各予想のスコアを表す
precision, recall, _=precision_recall_curve(y_test, test_score)
plt.plot(precision, recall)
# plt.plot([0,1],[0,1], linestyle='--')
# plt.xlim([-.01,1.01])
plt.xlabel('Recall')
plt.ylabel('Precision')
x軸にRecall、y軸にPrecisionをとったグラフ