Python

【はじめての重回帰分析】アワビの年齢予測

諸々をインポート

今回不要なものもありますが、機械学習を一通りやるには必要最低限なものが揃っているので、全てインストールしておくことをおすすめします。

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 で線形回帰 (単回帰分析・重回帰分析)

 

Seaborn で散布図・回帰モデルを可視化する

Mickey@コーヒー好きエンジニア

【製造業×プログラミング×AI】Python/VBAを活用した業務改善、Streamlit/Plotlyを活用したWebアプリ開発について初心者向けに発信中|趣味は自家焙煎コーヒー作り|noteでは焙煎理論を発信|ココナラではプログラミングに関する相談,就職/転職やコーヒーに関する相談などのサービスをやっています