今回不要なものもありますが、機械学習を一通りやるには必要最低限なものが揃っているので、全てインストールしておくことをおすすめします。
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の場合)
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%の確率で薄いブルーの範囲内に収まることを意味)
sns.regplot(x=Y_test, y=y_pred, order=3,ci=50)
scikit-learn で線形回帰 (単回帰分析・重回帰分析)