前回の記事で「Scikit-learn」で「回帰」分析をした結果、13.8053143であったが、これを改善したい
yのヒストグラムを確認する。
.py
plt.hist(train["y"])
trainXの予測値とyの散布図を確認する。
.py
result_trainX = model.predict(trainX)
plt.scatter(result_trainX,y)
plt.xlabel("result_trainX")
plt.ylabel("y")
trainXの予測値のヒストグラムを確認する。
.py
plt.hist(result_trainX)
(1)p値を調べて不要な入力変数を取り除く。
.py
from sklearn.feature_selection import f_regression
p_value = f_regression(trainX,y)[1]
p_value.round(3)
# array([0.493, 0.016, 0. , 0.881, 0.505, 0.118, 0.973, 0.976, 0.095,0.872, 0. ])
t = trainX.columns
p1 = pd.DataFrame(p_value.round(3))
p2 = pd.DataFrame(t)
p3 = pd.concat([p1,p2],axis = 1)
p3
p値は0.05以下だと入力変数は有意とされているので、trainXの火、水、金を取り除いてみる。
.py
# trainXの火、水、金を取り除いてみる
trainX.head()
trainX2 = trainX.drop(["火","水","金"],axis=1)
trainX2.head()
# testXも、火、水、金を取り除いてみる
testX2 = testX.drop(["火","水","金"],axis=1)
testX2.head()
モデルを定義する。
.py
model2 = LR()
model2.fit(trainX2,y)
result = model2.predict(testX2)
result_trainX2 = model2.predict(trainX2)
plt.scatter(result_trainX2,y)
plt.xlabel("result_trainX2")
plt.ylabel("y")
.py
sample[1] =result
sample.to_csv("submit9_kaiki.csv",header = None,index = None)
結果は12.7134081となり、少し精度が上がった
(2)yを標準化する
.py
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(trainX2)
trainX2_scaled = scaler.transform(trainX2)
trainX2_scaled = pd.DataFrame(trainX2_scaled)
trainX2_scaled
# testXも同様にする
testX2_scaled = scaler.transform(testX2)
testX2_scaled = pd.DataFrame(testX2_scaled)
testX2_scaled
モデルを定義する。
.py
model3 = LR()
model3.fit(trainX2_scaled,y)
result_365 = model3.predict(testX2_scaled)
result_trainX2_scaled = model3.predict(trainX2_scaled)
plt.scatter(result_trainX2_scaled,y)
plt.xlabel("result_trainX2_scaled")
plt.ylabel("y")
.py
sample[1] =result_365
sample.to_csv("submit10_kaiki.csv",header = None,index = None)
結果は12.7134081となり、正規化する前と変動なかった。
(3)yが正規分布ではなく指数分布なので対数化する
.py
plt.hist(y)
.py
log_y = np.log(y)
plt.hist(log_y)
モデルを定義する。
.py
model4 = LR()
model4.fit(trainX2_scaled,log_y)
result_365 = model4.predict(testX2_scaled)
result_trainX2_scaled = model4.predict(trainX2_scaled)
plt.scatter(result_trainX2_scaled,y)
plt.xlabel("result_trainX2_scaled")
plt.ylabel("y")
結果は13.2649969となり、微妙に精度が落ちた。