'Scikit-learn'에서 '회귀' 분석하기(계속)

이전 기사에서 'Scikit-learn'에서 '회귀' 분석을 한 결과 13.8053143이었지만 이를 개선하고 싶다



y의 히스토그램을 확인합니다.
plt.hist(train["y"])



trainX의 예측값과 y의 산점도를 확인한다.
result_trainX = model.predict(trainX)
plt.scatter(result_trainX,y)
plt.xlabel("result_trainX")
plt.ylabel("y")



trainX 예측값의 히스토그램을 확인합니다.
plt.hist(result_trainX)



(1) p-값을 조사하여 불필요한 입력 변수를 제거한다.


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의 불, 물, 금을 제거해 본다.
#trainXの火、水、金を取り除いてみる
trainX.head()
trainX2 = trainX.drop(["火","水","金"],axis=1)
trainX2.head()
#testXも、火、水、金を取り除いてみる
testX2 = testX.drop(["火","水","金"],axis=1)
testX2.head()

모델을 정의한다.
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")


sample[1] =result
sample.to_csv("submit9_kaiki.csv",header = None,index = None)

결과는 12.7134081이 되어 조금 정밀도가 올랐다.

(2) y를 표준화한다


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

모델을 정의한다.
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")


sample[1] =result_365
sample.to_csv("submit10_kaiki.csv",header = None,index = None)

결과는 12.7134081이었고 정규화하기 전과 변동하지 않았다.

(3) y가 정규 분포가 아닌 지수 분포이므로 대수화
plt.hist(y)


log_y = np.log(y)
plt.hist(log_y)



모델을 정의한다.
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가 되어 미묘하게 정밀도가 떨어졌다.

좋은 웹페이지 즐겨찾기