諸々をインポート
今回不要なものもありますが、機械学習を一通りやるには必要最低限なものが揃っているので、全てインストールしておくことをおすすめします。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import sklearn.preprocessing as sp
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import StandardScaler
import pydotplus
from IPython.display import Image
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LinearRegression
from sklearn import tree
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
import lightgbm as lgb
# Scikit-learn(評価算出)
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn import metrics
# graphvizのdotファイルを生成する
from sklearn import datasets
from sklearn.cluster import MiniBatchKMeans
from sklearn import tree
from sklearn.preprocessing import StandardScaler
ファイルの読み込み
同じ階層にファイルがある場合は下記とパスを同様にする。
train=pd.read_table('./train.tsv')
test=pd.read_table('./test.tsv')
sub=pd.read_csv('./sample_submit.csv')
データの前処理
drop_col = ['id','Sex']
Y=train['Rings']
X=train.drop(drop_col, axis=1)
X=X.drop('Rings', axis=1)
test=test.drop(drop_col, axis=1)
正規化処理
データのスケールが合うようにデータフレームの各列を正規化します。
X= X.apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))
重回帰解析の学習準備
学習用データ7割とテストデータ3割に分けてトレーニング開始。
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
model = LinearRegression()
model.fit(X_train, Y_train)
トレーニングデータ結果の確認(R2、MAE、RMSE)
y_pred = model.predict(X_train)
sns.regplot(x=Y_train, y=y_pred,ci=50)
r2_score_X=r2_score(Y_train,y_pred)
mean_X =mean_absolute_error(Y_train,y_pred)
mse_X =np.sqrt(mean_squared_error(Y_train,y_pred))
print('R2:',r2_score_X)
print('MAE:',mean_X)
print('RMSE:',mse_X)
R2: 0.5229809337386528
MAE: 1.6729653495700636
RMSE: 2.3027574794622754
テストデータ結果の確認
y_pred = model.predict(X_test)
sns.regplot(x=Y_test, y=y_pred,ci=50)
r2_score_X=r2_score(Y_test,y_pred)
mean_X =mean_absolute_error(Y_test,y_pred)
mse_X =np.sqrt(mean_squared_error(Y_test,y_pred))
print('R2:',r2_score_X)
print('MAE:',mean_X)
print('RMSE:',mse_X)
R2: 0.47339089287426594
MAE: 1.6347240131944056
RMSE: 2.2827905572350726
回帰係数の確認
# 偏回帰係数
print(pd.DataFrame({"Name":X_train.columns,
"Coefficients":model.coef_}).sort_values(by='Coefficients') )
# 切片 (誤差)
print(model.intercept_)
Name Coefficients 4 Shucked weight -24.773568 5 Viscera weight -4.726751 0 Length -2.199531 2 Height 7.553851 6 Shell weight 8.943206 1 Diameter 9.408596 3 Whole weight 22.161568 9.990579312411466
おまけ:Matplotlib、Seabornのプロットについて比較
結果のプロット(Matplotlibの場合)
plt.scatter(Y_test, y_pred)
plt.plot([0,25],[0,25],color='black')
1:1の線を追加してプロットしてみます。
結果のプロット(Seabornの場合)
sns.regplot(x=Y_test, y=y_pred,ci=50)
信頼区間を50%に設定。(50%の確率で薄いブルーの範囲内に収まることを意味)
多項式回帰近似(3 次、信頼区間は50%)の場合
sns.regplot(x=Y_test, y=y_pred, order=3,ci=50)
参考記事
scikit-learn で線形回帰 (単回帰分析・重回帰分析)