タイタニック号ですらややこしいので、めっちゃシンプルな機械学習モデルをpythonで書いてみた。入力=点数、出力=合否で、点数から合格点を推測する!
60点以上なら合格の学習データから、機械学習モデルを作ってみる。
特徴量エンジニアリング(与えられたデータから、機械学習用に変換する事)は無し。入力は点数のみ!
やっている事
1, ランダムな点数(score)と60点以上なら合格(result)の配列を1000件作る
2, pandasでデータフレーム化
3, 80%のデータを学習データに、残り20%を検証データにする
4, モデルのfitメソッドを実行するだけで、機械学習できる(ブラックボックス!)
5, 機械学習モデルを使って、テストデータの点数から、合否(合格点)を予測する
6, 結果発表、完全一致なら1.0
7, 合格点ギリギリを攻めてみる。58,59,60,61点
データが100件だと割と間違えるけど、1000件ならほぼ正解する。機械学習すごい!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import numpy as np import pandas as pd import random from sklearn.linear_model import LogisticRegression # 機械学習モデル(ロジスティック回帰) from sklearn.model_selection import train_test_split # 学習データとテストデータに分離 from sklearn.metrics import accuracy_score # 機械学習の精度を測定 # 特徴量エンジニアリングは無し。入力は点数のみ! #乱数で、点数と合否の配列を生成 l = list() for num in range(1000): score = random.randint(0, 100) # 点数 result = 1 if score >= 60 else 0 # 60点以上で合格(1) l.append([score, result]) # pandasでデータフレーム化 df = pd.DataFrame( columns=["score", "result"], data=l ) df.head() # 80%のデータを学習データに、残り20%を検証データにする X_train, X_test, Y_train, Y_test = train_test_split(df['score'],df['result'], train_size = 0.8) # パラメータ(説明変数)は複数が基本なので、2次元配列にする # [1,2,3] => [[1],[2],[3]] X_train = np.array(X_train).reshape(-1,1) X_test = np.array(X_test).reshape(-1,1) # fitメソッドを実行するだけで、機械学習できる(ブラックボックス!) model = LogisticRegression() model.fit(X_train, Y_train) # 機械学習モデルを使って、テストデータの点数から、合否(合格点)を予測する Y_pred = model.predict(X_test) # 結果発表、完全一致なら1.0 accuracy_score(Y_test, Y_pred) # 合格点ギリギリを攻めてみる print(model.predict([[58],[59],[60],[61]])) # [0 0 1 1] なら機械学習が上手く行っている。 # データが100件だと割と間違えるけど、1000件ならほぼ正解する。機械学習すごい! # 回帰式(y=ax+b)のaとbを求めてみる print("coefficient = ", model.coef_) # 重み(偏回帰係数) print("intercept = ", model.intercept_) # 切片 # y=ax+bをグラフ化して、本当に60点で分類されているか確認する import matplotlib.pyplot as plt %matplotlib inline x = np.arange(0,100) y = model.coef_[0]*x + model.intercept_ plt.plot(x,y) plt.grid() |
y=ax+bで計算してみたら、たしかに60点で分類されている(プラスになっている)
4.19935238=61*2.59861727-154.31630109
1.60073511=60*2.59861727-154.31630109
-0.99788216=59*2.59861727-154.31630109
-3.59649943=58*2.59861727-154.31630109