3σ法と標準化を考慮して重回帰分析を実装する

スポンサーリンク

ライブラリを読み込む

import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler #機械学習ライブラリ>標準化関数

学習データを読み込む

df=pd.read_csv("housing.csv")

3σ法で外れ値を除去する

平均値に標準偏差の3倍を加えた値を限界値として、外れ値を除去します。

mean=df.mean() #各列の平均値を計算
sigma=df.std() #各列の標準偏差を計算

cols=df.columns #ヘッダーからカラム名を取得

df2=df

for col in cols:
  low=mean[col]-(3*sigma[col]) #平均値±標準偏差*3の値を取得
  high=mean[col]+(3*sigma[col])
  df2=df2[(df2[col]>low) & (df2[col]<high)] #外れ値の行を除去

len(df2) #レコード数の確認

説明変数と目的変数を分割する

X=df2.iloc[:, :-1]
y=df2.iloc[:, -1]

訓練データと検証データを分割する

X_train, X_test, y_train, y_test=train_test_split(X, y, test_size = 0.5, random_state=1)

標準化する

scaler=StandardScaler() #標準化関数の宣言
scaler.fit(X_train) #scalerの学習(平均値と標準偏差を計算)

X_train2=scaler.transform(X_train) #訓練データの標準化
X_test2=scaler.transform(X_test) #検証データの標準化

学習したモデルを使って入力を推論するのが機械学習なので、何が来るかを知っていて推論に使うのでは実用的に意味がありません。訓練データにfitして求めた平均値と標準偏差を使って、検証データにtransformする流れが一般的です。

モデルの構築と検証する

yの値は標準化しないでOKです。

model=LinearRegression()
model.fit(X_train2, y_train)
model.score(X,y)

model.score(X_train2, y_train)
model.score(X_test2, y_test)

パラメータの重みを確認する

標準化することで、変数間のスケールが統一され、重みの大きさから各変数の重要度を評価できます。

np.set_printoptions(precision=1, suppress=True) #小数1桁、指数表記禁止
model.coef_ #重みを確認

コメント

タイトルとURLをコピーしました