scikit-learnで線形回帰分析するテンプレプログラム
自動車の走行距離を予測するこちらの問題を想定しています。
https://signate.jp/competitions/121
インプットデータ
https://archive.ics.uci.edu/ml/datasets/Auto+MPG
こちらのデータに、
・id列が付与
・1行目に見出しが付与
という状態が「train.tsv」、
・id列が付与
・mpg列が削除
・1行目に見出しが付与
という状態が「test.tsv」です。
問題
その他のデータからmpgを予測します。
プログラム全体
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import sklearn.model_selection
from sklearn import linear_model
from sklearn import preprocessing
from sklearn.metrics import mean_squared_error
#訓練データの読み込み
train_data = pd.read_csv("ディレクトリ/train.tsv", delimiter='\t')
#「?」を「NaN」に変換し、その後中央値を当てはめる
imp = preprocessing.Imputer(missing_values='NaN', strategy='median')
X = DataFrame(imp.fit_transform(train_data.drop(["id", "mpg", "car name"], 1).replace('?', 'NaN')))
#標準化
scaler = preprocessing.StandardScaler()
X = scaler.fit_transform(X)
Y = train_data['mpg']
#訓練データを設定(訓練・検証時)
#X_train, X_test, Y_train, Y_test = sklearn.model_selection.train_test_split(X,Y)
#訓練データを設定(予測時)
X_train = X
Y_train = Y
#線形回帰
linear_regression = linear_model.LinearRegression()
linear_regression.fit(X_train,Y_train)
#係数を出力
print("Coefficient:")
print(linear_regression.coef_)
#検証データの読み込み(予測時)
test_data = pd.read_csv("ディレクトリ/test.tsv", delimiter='\t')
imp = preprocessing.Imputer(missing_values='NaN', strategy='median')
X_test = DataFrame(imp.fit_transform(test_data.drop(["id", "car name"], 1).replace('?', 'NaN')))
X_test = scaler.fit_transform(X_test)
#検証
predict_output = DataFrame(linear_regression.predict(X_test))
#モデル精度評価(訓練・検証時)
#print("RMSE:")
#print(np.sqrt(mean_squared_error(predict_output,Y_test)))
#結果出力(予測時)
predict_output.index = test_data['id']
predict_output.to_csv("ディレクトリ/output.csv", header=False)
前処理
#訓練データの読み込み
train_data = pd.read_csv("ディレクトリ/train.tsv", delimiter='\t')
#「?」を「NaN」に変換し、その後中央値を当てはめる
imp = preprocessing.Imputer(missing_values='NaN', strategy='median')
X = DataFrame(imp.fit_transform(train_data.drop(["id", "mpg", "car name"], 1).replace('?', 'NaN')))
#標準化
scaler = preprocessing.StandardScaler()
X = scaler.fit_transform(X)
Y = train_data['mpg']
・インプットデータ内に「?」という文字が含まれているので、中央値に変換します。「?」のままImputerで中央値を設定するのがうまくいかなかったので、一度「NaN」に変換してから入れることにしました
・「car name」以外をすべて特徴量として選択していますが、精度を上げるためにはここの取捨選択が必要かもしれません
・最後にXを標準化しています
回帰処理
#訓練データを設定(訓練・検証時)
#X_train, X_test, Y_train, Y_test = sklearn.model_selection.train_test_split(X,Y)
#訓練データを設定(予測時)
X_train = X
Y_train = Y
#線形回帰
linear_regression = linear_model.LinearRegression()
linear_regression.fit(X_train,Y_train)
#係数を出力
print("Coefficient:")
print(linear_regression.coef_)
・訓練時はtrain.tsvを訓練用と検証用に分割、予測時はtrain.tsvをすべて訓練データに充てます
・回帰計算後、係数を確認します
検証・予測
#検証データの読み込み(予測時)
test_data = pd.read_csv("ディレクトリ/test.tsv", delimiter='\t')
imp = preprocessing.Imputer(missing_values='NaN', strategy='median')
X_test = DataFrame(imp.fit_transform(test_data.drop(["id", "car name"], 1).replace('?', 'NaN')))
X_test = scaler.fit_transform(X_test)
#検証
predict_output = DataFrame(linear_regression.predict(X_test))
#モデル精度評価(訓練・検証時)
#print("RMSE:")
#print(np.sqrt(mean_squared_error(predict_output,Y_test)))
#結果出力(予測時)
predict_output.index = test_data['id']
predict_output.to_csv("ディレクトリ/output.csv", header=False)
・予測時は、test.tsvを読み込んで、train.tsvと同じ変換処理を施します
・検証後、訓練時はRMSEで精度を評価して出力、予測時はoutput.csvに結果を出力
実行結果
Coefficient:
[-1.41830379 1.58265116 -1.3261924 -3.71601883 -0.13536341 2.74750112
1.40167994]
RMSE:
3.482252499580515
・weightとmodel yearが強く効いていて、accelerationがあまり効いていないようです
・RMSEはSIGNATEのランキングトップが2.3台なので、まだまだ伸びしろがありそうです
この記事が気に入ったらサポートをしてみませんか?