線形回帰

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台なので、まだまだ伸びしろがありそうです

この記事が気に入ったらサポートをしてみませんか?