「Scikit-learn」で「回帰」分析をする（続き）

#前回の記事で「Scikit-learn」で「回帰」分析をした結果、13.8053143であったが、これを改善したい

yのヒストグラムを確認する。

```.py
plt.hist(train["y"])
```
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/19bde965-a02e-ea47-a12d-22ef1842796b.png)


trainXの予測値とyの散布図を確認する。

```.py
result_trainX = model.predict(trainX)
plt.scatter(result_trainX,y)
plt.xlabel("result_trainX")
plt.ylabel("y")
```
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/3f06d450-3b97-7135-79a2-f1b63520a0bc.png)


trainXの予測値のヒストグラムを確認する。

```.py
plt.hist(result_trainX)
```
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/c7da1592-6d71-960e-c191-ed0bb7a063e1.png)



#（１）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
```
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/5f4f3abc-f161-9ce5-ec91-0b2e9f1bd6c5.png)


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")
```
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/f9454003-1bb8-f23f-1e44-732f636a5911.png)


```.py
sample[1] =result
sample.to_csv("submit9_kaiki.csv",header = None,index = None)
```
結果は12.7134081となり、少し精度が上がった

#（２）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")
```
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/3144618b-4bb6-1eac-1409-5777d62bd8ed.png)


```.py
sample[1] =result_365
sample.to_csv("submit10_kaiki.csv",header = None,index = None)
```
結果は12.7134081となり、正規化する前と変動なかった。

（３）yが正規分布ではなく指数分布なので対数化する

```.py
plt.hist(y)
```
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/f35e4f58-7894-cecb-7f45-c2eef3a9082e.png)


```.py
log_y = np.log(y)
plt.hist(log_y)
```
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/5153ca89-ffed-ba0f-ea19-c924adaee7cf.png)


モデルを定義する。

```.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となり、微妙に精度が落ちた。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/2f6a1575-410a-ddc2-b1c6-2caef00b5b9b.png)