Pythonを使った超基本的な教師あり学習のコードを書いていきます。
ある学校では、年間の総合成績を前期の中間試験と期末試験、後期の中間試験と期末試験、そして平常点を加えて総合的につけているとします。
ある年のある科目の前期の中間試験と前期の期末試験、そしてその年の年間総合成績が記載されたCSVファイルは以下の様な内容になっていたとします。(勿論、架空のデータです。)
そして、別の年の前期の中間試験と期末試験の結果が以下の様になっていたとします。
この時、この年の年間総合成績がどうなるか予測してみましょう。
まずは教師データを読み込みます。
import pandas as pd
#CSVファイル読み込み。
train_df = pd.read_csv('data/seiseki_sample.csv')
display(train_df)
# X_trainに年間総合成績を除いたtrain_dfを代入。
X_train = train_df.drop("年間総合成績", axis=1)
# Y_trainに年間総合成績のみが入ったtrain_dfを代入。
Y_train = train_df["年間総合成績"]
次にテストデータを読み込みます。
X_test = pd.read_csv('data/test_result.csv')
そして、外部ライブラリと教師データを使って分類モデルを作り、結果を予測させます。ここでは試しにロジスティック回帰による分類モデルを作成します。
ロジスティック回帰は回帰という名前がついていますが分類に用いられる手法で、線形回帰ではないですが何故かsklearnではlinear modelに含まれます。
from sklearn.linear_model import LogisticRegression
#教師データX_trainとY_trainを使いロジスティック回帰による分類モデルを作成。
lg = LogisticRegression()
lg.fit(X_train, Y_train)
Y_pred = lg.predict(X_test)
Predict = pd.DataFrame({
"前期中間試験": X_test["前期中間試験"],
"前期期末試験": X_test["前期期末試験"],
"年間総合成績": Y_pred
})
Predict.to_csv('data/lg.predict.csv', index=False, encoding="SHIFT-JISx0213")
結果のcsvファイルを見てみると、下のような感じになってます。
教師データと全く同じ値をテストデータとして使った場合でも、元々の結果(この場合は年間総合成績)と全く同じ結果になるとは限りません。
さて、実際の結果が以下のようになっていたとしましょう。
X_answer = pd.read_csv('data/test_answer.csv')
X_answer
このとき、予測の精度を評価するには以下のように書きます。
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(X_answer["年間総合成績"], Predict["年間総合成績"])
print('Accuracy:', accuracy)
ハイパーパラメータ
sklearn.linear_model.LogisticRegressionの公式サイトを参照。
Kaggleでも使ってみました。
Spaceship_Titanicというコンペで同様のコードを書いてみました。
シグモイド関数
ロジスティック回帰には以下のシグモイド関数が用いられます。
\sigma(x) = \frac{1}{1 + e^{-x}}
この関数は、以下の微分方程式を満たします。
\frac{d}{dx} \sigma(x) = \sigma(x) \cdot (1 - \sigma(x))
因みに、将棋ソフトの評価値と勝率の関係はシグモイド関数に似ていることが実験的に知られています。