風待ち

プログラミングの勉強や日々の出来事のログなど

テキトーなCSVファイルを用意してscikit-learnをテキトーに使ってみる

機械学習の本を読んでサンプルをいじっているだけでは、わかったつもりになるだけで実際に使えるようにはならないので、本当にテキトーなデータで機械学習してみる。

まず、テキトーなCSVデータ(「train.csv」って名前で保存)を用意する。下のは一部でこんな感じでたくさん用意する。

YYYY,MM,DD,DY,target
2018,1,20,土,2038
2018,1,21,日,2039
2018,1,22,月,2040
2018,1,23,火,2041
2018,1,24,水,2042
2018,1,25,木,2043

このCSVの「target」行を予測するモデルを作ってみる。

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.externals import joblib

train_csv_file = "train.csv"
target_column_name = "target"

data = pd.read_csv(train_csv_file, encoding="SHIFT-JIS", sep=",")

le = LabelEncoder()
for col in data.loc[:, data.dtypes == 'object']:
    data[col] = le.fit_transform(data[col])

for col in data.loc[:, data.dtypes == 'int32']:
    data[col] = data[col].astype(float)

X = data.loc[:, data.columns != target_column_name].as_matrix()
y = data[target_column_name].as_matrix()

scaler = StandardScaler()
scaler.fit(X)
X = scaler.transform(X)

X_train, X_test, y_train, y_test = train_test_split(X, y)

model = KNeighborsRegressor(n_neighbors=5)
model.fit(X_train, y_train)

print("Train score: {:.2f}".format(model.score(X_train, y_train)))
print("Test  score: {:.2f}".format(model.score(X_test, y_test)))

joblib.dump(scaler, "foo.scaler")
joblib.dump(model, "foo.learn")

こんななんの役にも立たないモデルでも一応、動くものを作った方が勉強にはなるだろう。