この記事の内容
scikit-learnに含まれている基本的な機械学習法の覚え書きです。簡易的な使用法の羅列ですので、ご容赦ください。
- 教師あり学習 (この記事)
- 単回帰分析
- 重回帰分析
- ロジスティック回帰 (二値分類)
- ロジスティック回帰 (多値分類)
- ランダムフォレスト法 (分類)
- ランダムフォレスト法 (回帰)
- サポートベクタマシン(SVM)
- K近傍法 (K-NearestNeighbor)(分類)
- K近傍法 (K-NearestNeighbor)(回帰)
- 教師なし学習 (以下のURLにて)
- 主成分分析(PCA)
- k-means
- t-SNE
データセットのインポート
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df_iris = pd.DataFrame(data=iris.data,columns=iris.feature_names)
単回帰分析
from sklearn.linear_model import LinearRegression
#インスタンスの作成
clf = LinearRegression()
#データ数nの場合、n×1の行列を作成する
X = df_iris['sepal length (cm)'].values.reshape(-1,1)
Y = iris.target
# 学習
clf.fit(X, Y)
# 回帰係数
print(clf.coef_)
# 切片
print(clf.intercept_)
重回帰分析
各変数がどの程度目的変数に影響しているかを偏回帰係数の大きさの比較で書くにするため正規化を行う。(normalize=True)
from sklearn.linear_model import LinearRegression
# インスタンスの作成
clf = LinearRegression(normalize=True)
X = df_iris[iris.feature_names].values
Y = iris.target
# 学習
clf.fit(X, Y)
# 回帰係数
print(clf.coef_)
# 切片
print(clf.intercept_)
ロジスティック回帰 (二値分類)
ロジスティック回帰とはベルヌーイ分布に従う統計回帰モデルの一つで、分類問題を行うためのアルゴリズムの一つ。ベルヌーイ分布とは2種類の結果のみが得られる試行の結果を0,1で表した分布。シグモイド関数を用いて、事象が起こる確率を0から1の範囲で算出する。つまり、二値分類で出力された確率をそのまま事象が起こる確率とみなせる。
LogisticRegression() | 引数 | 説明 |
---|---|---|
penalty | l1:L1正則化、l2:L2正則化 | ペナルティ関数の設定 |
C | 正則化の影響度の設定 | |
random_state | 乱数 | |
solver | 'newton-cg','lbfgs','liblinear','sag','saga' | 最適化のアルゴリズム |
max_iter | 収束計算の最大試行回数 | |
n_jobs | 計算に使うジョブの数 |
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
df_iris_ = df_iris.loc[:99][:]
iris_target = iris.target[:100]
# インスタンス作成
clf = LogisticRegression(solver='liblinear')
# 説明変数
X = df_iris_[iris.feature_names].values
# 目的変数
Y = iris_target
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3)
clf.fit(X_train, y_train)
clf.predict_proba(X_test)
print(accuracy_score(y_test,clf.predict(X_test)))
ロジスティック回帰 (多値分類)
二値分類では、シグモイド関数を1つ用意することでそれぞれのクラスに属する確率を1以下で表した。多値分類では、入力値☓クラス属性の行列を作成し、各クラスごとの確立値を算出する。
コードは同じですが、中で行っている計算は二値分類と多値分類では異なります。
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# インスタンス作成
clf = LogisticRegression(solver='liblinear')
# 説明変数
X = df_iris[iris.feature_names].values
# 目的変数
Y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3)
clf.fit(X_train, y_train)
clf.predict_proba(X_test)
ランダムフォレスト法 (分類)
ランダムフォレストは複数のデータの多数決や平均値をもとに少しずつ違う決定木を集めたアンサンブル学習の一つです。つまり、精度の低い複数の結果を組み合わせることで、精度を向上させる機械学習法です。ランダムフォレストはscikit-learn.ensembleの中から分類問題の場合はRandomForestClassifier、回帰問題の場合はRandomForestRegressorというモジュールをインポートします。データ内の重要な特徴量をfeature_importances_で抽出することができる。
引数 | 説明 | |
---|---|---|
n_estimators | 決定木の個数を指定 | |
criterion | 'gini-cg', 'entropy' | 決定木のデータ分割の指標 |
max_depth | 決定木の深さの最大値を指定 | |
n_jobs | 計算に使うジョブの数 | |
random_state | 乱数 | |
verbose | デフォルトは0 | モデル構築の過程のメッセージを出すか |
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
clf = RandomForestClassifier(random_state=0)
X = df_iris[iris.feature_names].values
Y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2,random_state=0)
clf.fit(X_train, y_train)
print(accuracy_score(y_test,clf.predict(X_test)))
# 特徴重要度
feature_importance = pd.DataFrame({'feature':iris.feature_names,'importances':clf.feature_importances_}).sort_values(by="importances", ascending=False)
ランダムフォレスト法 (回帰)
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
clf = RandomForestRegressor(random_state=0)
df_iris_ = df_iris.loc[:99][:]
X = df_iris_[iris.feature_names].values
Y = iris.target[:100]
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2,random_state=0)
clf.fit(X_train, y_train)
# 特徴重要度
feature_importance = pd.DataFrame({'feature':iris.feature_names,'importances':clf.feature_importances_}).sort_values(by="importances", ascending=False)
サポートベクタマシン (SVM)
サポートベクタマシンはクラスを明確に分割する境界線を引くためのアルゴリズムで、サポートベクターとは「データを分割する直線に最も近いデータ」です。「マージン最大化」と呼ばれる考え方を使い、正しい分類基準を見つけます。
scikit-learnに含まれるSVMの種類
- 分類問題(Support Vector Classification)
- SVC(C-Support Vector Classification)← これだけやります
- LinearSVC (Linear Support Vector Classification)
- NuSVC (Nu-Support Vector Classification)
- 回帰問題(Support Vector Regression)
- SVR
- LinearSVR
- NuSVR
- 異常検知のためのSVM
- OneClassSVM
SVC() | 引数 | 説明 |
---|---|---|
C | 正則化のパラメータ | |
kernel | 'linear','poly','rbf','sigmoid','precomputed' | アルゴリズムで使用するカーネルタイプ |
degree | kernel='poly'の時のみ有効 | 多項式カーネル関数の次数 |
gamma | カーネルがrbf、poly、sigmoidの時のカーネル係数 | |
random_state | 乱数 | |
verbose | デフォルトは0 | モデル構築の過程のメッセージを出すか |
クラスのメソッドはロジスティック回帰などと同様。
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
clf = SVC(random_state=0)
X = df_iris[iris.feature_names].values
Y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3,random_state=0)
clf.fit(X_train, y_train)
clf.predict(X_test)
sklearn.model_selectionのGridSearchCVモジュールを使用することで、パラメータを細かく設定することができる。
K近傍法 (分類)
学習データをベクトル空間上に予めプロットしておき、未知のデータをそのベクトル空間にプロットする。その点の近傍にあるK個の学習データの多数決から、未知データの属するクラスを推定する。
scikit-learn.neighborsの中から分類問題はKNeighborsClassifier、回帰問題はKNeighborsRegressorというモジュールを使用します。
SVC() | 引数 | 説明 |
---|---|---|
n_neighbors | デフォルトは5 | 近傍オブジェクト数 |
weights | 'uniform','distance'(デフォルトはuniform) | 重み |
algorithm | 'ball_tree','kd_tree','brute','auto'(デフォルトはauto) | アルゴリズム選択 |
leaf_size | リーフサイズ | デフォルトは30 |
n_jobs | 計算に使うジョブの数 | |
計算に使うジョブの数 | デフォルトは0 | モデル構築の過程のメッセージを出すか |
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
clf = KNeighborsClassifier(n_neighbors=3)
X = df_iris[iris.feature_names].values
Y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3,random_state=0)
clf.fit(X_train, y_train)
print(accuracy_score(y_test,clf.predict(X_test)))
K近傍法 (回帰)
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
clf = KNeighborsRegressor(n_neighbors=3)
df_iris_ = df_iris.loc[:99][:]
X = df_iris_[iris.feature_names].values
Y = iris.target[:100]
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3,random_state=0)
clf.fit(X_train, y_train)
最後に
私自身の解析法の使用方法のまとめを記しました。詳しい解説は、参考サイトや書籍にて確認をお願いいたします。
参考にしたサイト