SW/머신러닝

python : 머신러닝 : LinearRegression, Ridge, Lasso : 예제, 실습

얇은생각 2019. 11. 24. 07:30
반응형
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import r2_score,mean_absolute_error, mean_squared_error
import numpy as np

 

우선 라이브러리를 선언합니다.

 

 

dir = './gdrive/My Drive/Colab Notebooks/'

trainData = np.genfromtxt(dir+'oil_data_train.csv',delimiter=',', skip_header=1)
X_train = trainData[:,:-1]
y_train = trainData[:,-1]

 

훈련할 데이터를 로드합니다. 여러 본인의 데이터를 활용해도 무방합니다.

 

 

testData = np.genfromtxt(dir+'oil_data_test.csv',delimiter=',', skip_header=1)
X_test = testData[:,:-1]
y_test = testData[:,-1]

 

마찬가지로 테스트할 데이터를 로드합니다.

 

 

ridge_alpha = 1
lasso_alpha = 0.1

linear = LinearRegression()
ridge = Ridge(alpha = ridge_alpha)
lasso = Lasso(alpha = lasso_alpha)

 

기본적으로 가장 많이 쓰이는 선형, 릿지, 라쏘 모델을 선언합니다.

 

 

linear.fit(X_train,y_train)
ridge.fit(X_train,y_train)
lasso.fit(X_train,y_train)

"""
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
      normalize=False, positive=False, precompute=False, random_state=None,
      selection='cyclic', tol=0.0001, warm_start=False)
"""

 

그 후, 훈련할 데이터를 넣어서 훈련을 진행합니다.

 

 

linear_y_hat = linear.predict(X_test)
ridge_y_hat = ridge.predict(X_test)
lasso_y_hat = lasso.predict(X_test)

linear_r2, ridge_r2, lasso_r2 = r2_score(y_test,linear_y_hat), r2_score(y_test,ridge_y_hat), r2_score(y_test,lasso_y_hat)
linear_MSE, ridge_MSE, lasso_MSE = mean_squared_error(y_test,linear_y_hat), mean_squared_error(y_test,ridge_y_hat), mean_squared_error(y_test,lasso_y_hat)
linear_MAE, ridge_MAE, lasso_MAE = mean_absolute_error(y_test,linear_y_hat), mean_absolute_error(y_test,ridge_y_hat), mean_absolute_error(y_test,lasso_y_hat)

print('R2 score - Linear: %.2f, Ridge: %.2f, Lasso: %.2f' %(linear_r2, ridge_r2, lasso_r2))
print('MSE - Linear: %.2f, Ridge: %.2f, Lasso: %.2f' %(linear_MSE, ridge_MSE, lasso_MSE))
print('MAE - Linear: %.2f, Ridge: %.2f, Lasso: %.2f' %(linear_MAE, ridge_MAE, lasso_MAE))

"""
R2 score - Linear: 0.61, Ridge: 0.69, Lasso: 0.60
MSE - Linear: 0.11, Ridge: 0.08, Lasso: 0.11
MAE - Linear: 0.18, Ridge: 0.14, Lasso: 0.26
"""

 

이제 테스트할 데이터를 넣어서 테스트를 진행합니다. 각 모델에 따라 값들을 확인해볼 수도 있습니다.

 

 

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(len(y_test)), y_test, '-', label="Original Y")
ax.plot(range(len(y_test)), linear_y_hat, '-x', label="linear_y_hat")
ax.plot(range(len(y_test)), ridge_y_hat, '-x', label="ridge_y_hat")
ax.plot(range(len(y_test)), lasso_y_hat, '-x', label="lasso_y_hat")
plt.legend(loc='upper right')
plt.show()

데이터 결과

 

이제 테스트할 결과를 다음과 같이 나타낼 수 있습니다. 실제 데이터와 비교해서 어떻게 예측을 하고 있는지 가시화하면 이 이 모델이 활용할 수 있을지 알 수 있습니다. 

 

 

ridge_result = []
lasso_result = []
alpha = [0.001,0.01,0.1,1,10]

for a in alpha:
  ridge = Ridge(alpha = a)
  lasso = Lasso(alpha = a)

  ridge.fit(X_train,y_train)
  lasso.fit(X_train,y_train)

  ridge_y_hat = ridge.predict(X_test)
  lasso_y_hat = lasso.predict(X_test)

  ridge_r2, lasso_r2 = r2_score(y_test,ridge_y_hat), r2_score(y_test,lasso_y_hat)
  ridge_result.append(ridge_r2)
  lasso_result.append(lasso_r2)
  
  
  """
  /usr/local/lib/python3.6/dist-packages/sklearn/linear_model/coordinate_descent.py:475:
  ConvergenceWarning: Objective did not converge.
  You might want to increase the number of iterations. 
  Duality gap: 0.15977488986227362, tolerance: 0.0027677457287885 positive
  """

 

이제 예측한 값들의 알스퀘어 값들을 구해보도록 하겠습니다.

 

 

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(5), ridge_result, '-x', c='blue', label="R2 of Ridge")
ax.plot(range(5), lasso_result, '-x', c='red', label="R2 of Lasso")
plt.xticks(range(5), alpha)
plt.xlabel('alpha')
plt.ylabel('R2')
plt.legend(loc='upper right')
plt.show()

 

R2 릿지와 라쏘

릿지 모델의 값과 라쏘 모델의 값을 표현해보았습니다. 이 결과에서 릿지가 좀더 좋은 정확도를 나타내고 있다는 것을 알 수 있습니다.

반응형