利用者:波夛みん
1. データを収集する
2. データを理解する及びデータの前処理(特徴量のスケーリング)
※各次元の関係を分かりやすくするため
※引数が2つ(x, axis):
# e.g. zscore(x, axis = None):
<2-1> z-score normalization(標準化・正規化法) # ワインデータの分類精度の貢献
from sklearn.preprocessing import standardscaler
0: 平均
1: 分散(標準偏差)
分散スケーリング
基本は標準化が多い
min-maxが決まってない、若しくは外れ値が存在
<2-2> min-max normalization(正規化) # 乳癌悪性予測
from sklearn.preprocessing import MinMaxScaler
必須ではないが、予測精度を高めることができる
0: min
1: MAX # 0-1スケーリング手法
Min-Maxスケーリング # MinMaxScaler().fit
外れ値が大きく影響してしまう
画像処理など良く用いられる
(データクレンジングとも呼ばれ、データの重複やあるべきデータがない欠損データなどを取り除いてデータの精度を高めること。)
3. 特徴量、教師データの設計(評価方法・評価指標)
<3-1> hold-out validation(ホールドアウト法) # 乳癌悪性予測 # 住宅価格予測
from sklearn.model_selection import train_test_split
全部学習してしまうと過学習、未知データできなくなる
train_test_split(説明変数, 目的変数, test_size=0.25, random_state=0)
random_stateは種(seed)=疑似的な乱数
X_train, X_test, y_train, y_test = train_test_split(data, target, train_sizes=0.8, test_size=0.2) <3-2> cross-validation(交差検証)
汎化性能を測定する方法
k-fold cross validation(k-分割交差検証)
from sklearn.model_selection import cross_val_score, KFold
引数が4つ(clf, 説明変数, 目的変数, 分割する数):
clf = 機械学習アルゴリズム(決定木、SVM)
e.g. evaluate_cross_validation(clf, x, y, K=5)
※
cross_val_score()
ではfit()
もpredict()
も不要(分割、学習、検証が含まれる)
leave-one-out cross-validation(一つ抜き交差検証)
from sklearn.model_selection import LeaveOneOut
stratified k-fold cross-validation(層化k分割交差検証)
from sklearn.model_selection import StratifiedKFold
shuffle-split cross-validation(シャッフル分割交差検証)
from sklearn.model_selection import ShuffleSplit
<3-3> grid search(グリッドサーチ) # 乳癌悪性予測
from sklearn.model_selection import GridSearchCV
from sklearn import svm
svc = svm.SVC()
clf = GridSearchCV(svc, parameters)
clf.fit(X_train_norm, y_train)
clf.best_params_
hyperparameter探索
↑調整して汎化性能を向上させる方法を探す代表的な手法
もっとも良い精度を示したparameterを採用
引数3つ(svc, C, gamma): # SVCでのkernelのバンド幅gammaと正則化C
n通り組み合わせの中、一番良いものを採択
e.g. clf = GridSearchCV(svc, parameters)
parameters = [ {‘C’: [1, 5, 10, 50, 100, 150, 200], ‘gamma’: [0.1, 0.001, 0.0001, 0.0001]} ]
↑ 28通り
4. 機械学習アルゴリズムの選択と学習(機械学習)
<4.1> SVM(サポートベクターマシン) # 乳癌悪性予測(分類)
model = svm.SVC()
# モデルの指定
model.fit(X_train_norm, y_train)
# 学習
predict = model.predict(X_test_norm)
# 予測
<4.1.1>
clf = svm.SVC(C=50, gamma=0.1)
clf.fit(X_train_norm, y_train)
predict = clf.predict(X_test_norm)
<4.2> LinearRegression # 住宅価格予測(回帰)
from sklearn.linear_model import LogisticRegression
model = LinearRegression()
model = LinearRegression(verbose=True)
model = LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
model.fit(x, y)
price = model.predict(25)
model.fit(X_train, y_train)
price = model.predict(X_test)
5. テストデータを使った性能評価
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, classification_report
Classification
<5.1> confusion_matrix(混同行列) # 乳癌悪性予測 # 併せて確認
cmatrix = confusion_matrix(y_test, pred)
TN(真陰性) 0/0 FP(偽陽性) 0/1 FN(偽陰性) 1/0 TP(真陽性) 1/1
<5.2> accuracy_score(正解率)
accuracy_score(y_test, pred)
(TN+TP)/(TN+TP+FN+FP)
<5.3> precision_score(適合率) # FN(偽陰)が許容
TP/(TP+FP)
<5.4> recall_score(再現率) # 乳癌悪性予測 # FP(偽陽)が許容
recall_score(y_test, pred)
TP/(TP+FN) 癌のパターンFPが許容
<5.5> f1_score(F値)
2PR/(P+R)
<5.6> classification_report
Regression
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
from math import sqrt
<5.7> mean_squared_error(MSE: 平均二乗誤差)
mean_squared_error(y_test, pred1)
<5.8> sqrt(mean_squared_error)(RMSE: 二乗平均平方根誤差) # 住宅価格予測
np.sqrt(mean_squared_error(y_test, pred1))
sqrt(mean_squared_error(y_test, pred1))
<5.9> r2_score(決定係数・寄与率) # 住宅価格予測
r2_score(y_test, pred1)
6. ハイパーパラメーターチューニング
<3-3> grid search(グリッドサーチ)
7. サービスに組み込む
11. Classification(分類)
教師あり
<11.1> ロジスティック回帰
<11.2> 決定木(Decision Trees)
12. Regression(回帰)
教師あり
1. 線形(LinearRegression)、リッジ(RidgeRegression)
2. ラッソ(Lasso)
13. Clustering(クラスタリング)
教師なし
データの中で似たものの集まりを見つける手法
ラベルがないデータに対していくつかのグループ(クラスタ)に分ける
顧客のセグメント化やレコメンド、遺伝子の発見
<13.1> KMeans
実行速度が速く拡張性がある
K = クラスタの数を示すハイパーパラメータ # 必ずデータの数より小さい
真のクラスタが傾いた楕円形のクラスタや、多様体上の非線形なクラスタに上手くできない
複雑な形に分布しているデータは<14.2>
t-SNE
<13.2> 混合ガウスモデル 14. Dimensionality reduction(次元削減)
教師なし
<14-1> PCA
<14-2> t-SNE
— API —
[編集]load_digits() # Classification
load_iris() # Classification # svm.LinearSVC() # KNeighborsClassifier(n_neighbors=1) # RandomForestClassifier()
load_boston() # <3-1> <4-2> <5-8> <5-9>
load_breast_cancer() # <3-1> <2-2> <4-1> <5-1> <5-4> <3-3>
load_wine() # <2-1>
load_diabetes()
load_linnerud()
fetch_lfw_people(min_faces_per_person=20,resize=0.7) # <13.1>