AI/Machine Learning

[ML] 기본선형회귀 모델과 NNLS 모델 비교 코드

운호(Noah) 2020. 9. 7. 16:08

sklearn에서 boston data 가져오기

import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
boston = load_boston()

# boston data로 feature 생성
data = pd.DataFrame(boston.data, columns=boston.feature_names)

# boston data의 target 값도 추가
data['MEDV'] = pd.Series(data=boston.target, index=data.index)

feature, target 정의 및 훈련, 테스트 데이터 분리

# feature 값 정의
feature = data.drop('MEDV', axis = 1) 
# target 값 정의
target = data['MEDV'] 

# 훈련 데이터와 테스트 데이터 분리
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(feature, target, test_size = 0.33, random_state = 5)

기본 선형 회귀 모델 정의 및 학습

from sklearn.linear_model import LinearRegression

# 기본선형회귀모델 정의 및 훈련데이터로 학습
LR = LinearRegression()
LR.fit(X_train,Y_train)

# 모델의 weight(가중치)와 bias(절편) 출력
print('Coefficients: \n',LR.coef_) 
print('Intercept term: ',LR.intercept_)
# 테스트 데이터 예측값 도출
LR_Y_pred = LR.predict(X_test) 

NNLS(Non-Negative Least Squares) 회귀 모델 정의 및 학습

from scipy.optimize import nnls

# NNLS(Non-Negative Least Squares)회귀모델 정의 및 훈련데이터로 학습
# (모든 가중치가 0 또는 양수값을 가진다.)
nnls_coef, nnls_intercept =nnls(X_train.to_numpy(), Y_train.to_numpy(), maxiter=1000)

# 모델의 weight(가중치)와 bias(절편) 출력
print(nnls_coef)
print(nnls_intercept)
# NNLS를 통해 나온 각 weight 추출
C1=np.array(pd.DataFrame(nnls_coef).iloc[0])
C2=np.array(pd.DataFrame(nnls_coef).iloc[1])
C3=np.array(pd.DataFrame(nnls_coef).iloc[2])
C4=np.array(pd.DataFrame(nnls_coef).iloc[3])
C5=np.array(pd.DataFrame(nnls_coef).iloc[4])
C6=np.array(pd.DataFrame(nnls_coef).iloc[5])
C7=np.array(pd.DataFrame(nnls_coef).iloc[6])
C8=np.array(pd.DataFrame(nnls_coef).iloc[7])
C9=np.array(pd.DataFrame(nnls_coef).iloc[8])
C10=np.array(pd.DataFrame(nnls_coef).iloc[9])
C11=np.array(pd.DataFrame(nnls_coef).iloc[10])
C12=np.array(pd.DataFrame(nnls_coef).iloc[11])
C13=np.array(pd.DataFrame(nnls_coef).iloc[12])

# 테스트 데이터 예측값 도출
nnls_Y_pred = C1*X_test['CRIM']+C2*X_test['ZN']+C3*X_test['INDUS']+C4*X_test['CHAS']+C5*X_test['NOX']+C6*X_test['RM']+C7*X_test['AGE']+C8*X_test['DIS']+C9*X_test['RAD']+C10*X_test['TAX']+C11*X_test['PTRATIO']+C12*X_test['B']+C13*X_test['LSTAT']

기본선형회귀와 NNLS Metric 계산

from sklearn.metrics import r2_score

def mean_absolute_percentage_error(y_test, y_pred):
    y_test, y_pred = np.array(y_test), np.array(y_pred)
    return np.mean(np.abs((y_test - y_pred) / y_test)) * 100
# 기본선형회귀 metric
print("\nMAPE : ", mean_absolute_percentage_error(Y_test, LR_Y_pred))
print("R^2 : ", r2_score(Y_test, LR_Y_pred))
# nnls metric
print("\nMAPE : ", mean_absolute_percentage_error(Y_test,nnls_Y_pred))
print("R^2 : ", r2_score(Y_test, nnls_Y_pred))