2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

scikit-learn 教師あり学習の覚え書き

Last updated at Posted at 2022-09-06

この記事の内容

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)

最後に

私自身の解析法の使用方法のまとめを記しました。詳しい解説は、参考サイトや書籍にて確認をお願いいたします。

参考にしたサイト

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?