【scikit-learn】教師あり学習:高次元データの予測-5【Python】

本ページでは以下のページを要約するとともに、個人的な解説も記載しています。独特な解釈をしている部分があるので、誤りなどの指摘はtwitterまでお願いします。

参考ページ
Supervised learning: predicting an output variable from high-dimensional observations — scikit-learn 1.1.2 documentation
https://scikit-learn.org/stable/tutorial/statistical_inference/supervised_learning.html
閲覧日:2022年10月15日

分類

アヤメの分類のような、分類の問題で線形回帰をそのまま使用すると、予測した値が求めたい値とは全く別の値が出てしまいます。例えば、0か1のクラスで予測したいのに、0.1などが出力されてしまいます。そのため、分類にそのまま線形回帰のタスクを使うのは適切なアプローチではありません。
線形回帰の考えを分類の問題に適応させるためには、ロジスティック回帰かシグモイド関数を使用します。

以下のグラフを出力するコードはこちら
黒い点がロジスティック回帰を使った予測結果。
青い線が線形回帰で作成した直線。
赤い線は青い線の結果をシグモイド関数に入力し分類問題に適応させた結果。


y=sigmoid(Xβoffset)+ϵ=11+exp(Xβ+offset)+ϵy = \textrm{sigmoid}(X\beta - \textrm{offset}) + \epsilon = \frac{1}{1 + \textrm{exp}(- X\beta + \textrm{offset})} + \epsilon

ロジスティック回帰を使用して分類を行うとこのような結果が得られます。

以下のグラフを出力するコードはこちら

多クラス分類

予測するクラスが複数ある場合、よく使用される方法は1対全てのクラスのAIモデルを作成し最終的に多数決でクラスを決定する方法です。

正則化

ロジスティック回帰のハイパーパラメータで正則化の強度と種類を調整できます。Cが正則化項の強度で数値で指定します。値が小さいほど正則化項が強くなります。penaltyで種類を決定します。
none: ペナルティは追加されません。
l2: L2 ペナルティ項を追加します。これがデフォルトの選択です。
l1: L1 ペナルティ項を追加します。
elasticnet: L1 と L2 の両方のペナルティ項が追加されます。

練習

最近傍法とロジスティック回帰を使用して、手書き文字のデータセットを分類してみましょう。最後の10%をテストデータとしてスコアを確認してみましょう。

from sklearn import datasets, neighbors, linear_model

X_digits, y_digits = datasets.load_digits(return_X_y=True)
X_digits = X_digits / X_digits.max()

n_samples = len(X_digits)

X_train = X_digits[: int(0.9 * n_samples)]
y_train = y_digits[: int(0.9 * n_samples)]
X_test = X_digits[int(0.9 * n_samples) :]
y_test = y_digits[int(0.9 * n_samples) :]

knn = neighbors.KNeighborsClassifier()
logistic = linear_model.LogisticRegression(max_iter=1000)

print("KNN score: %f" % knn.fit(X_train, y_train).score(X_test, y_test))
print(
    "LogisticRegression score: %f"
    % logistic.fit(X_train, y_train).score(X_test, y_test)
)
#KNN score: 0.961111
#LogisticRegression score: 0.933333