본문 바로가기
Machine learning/Machine learning 강의

머신 러닝 다항 회귀(Polynomial Regression) #2 - sklearn으로 다중 회귀, 당뇨병 예측 학습 프로그램 만들기

by grey-hat hacker 2021. 2. 8.
728x90
from sklearn.datasets import load_boston
from sklearn.preprocessing import PolynomialFeatures #다항속성을 만들어주는 틀
from sklearn.model_selection import train_test_split #데이터를 트레이닝,테스트 셋 나누는 것 
from sklearn.linear_model import LinearRegression  #선형회기를 하기 위한 
from sklearn.metrics import mean_squared_error #모델을 평가하기 위해 사용하는 평균 제곱 오차 

import pandas as pd


boston_dataset = load_boston()

boston_dataset.data.shape
(506, 13)

boston_dataset.feature_names
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
       
polynomial_transformer = PolynomialFeatures(2)
polynomial_data = polynomial_transformer.fit_transform(boston_dataset.data)
polynomial_data.shape
(506, 105)

polynomial_feature_names = polynomial_transformer.get_feature_names(boston_dataset.feature_names)
polynomial_feature_names
['1',
 'CRIM',
 'ZN',
 'INDUS',
 'CHAS',
 'NOX',
 'RM',
 'AGE',
 'DIS',
 'RAD',
 'TAX',
 'PTRATIO',
 'B',
 'LSTAT',
 'CRIM^2',
 'CRIM ZN',
 'CRIM INDUS',
 
 
 x = pd.DataFrame(polynomial_data, columns = polynomial_feature_names)

다항회귀를 위한 데이터 준비!

y= pd.DataFrame(boston_dataset.target, columns=['MEDV'])
y
	MEDV
0	24.0
1	21.6
2	34.7
3	33.4
4	36.2
...     ...

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=5)
model = LinearRegression()
model.fit(x_train, y_train) #트레이닝셋의 목표 변수

y_test_prediction = model.predict(x_test)
mean_squared_error(y_test, y_test_prediction) ** 0.5

 

>>> boston_dataset.feature_names
>>> array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')

-> 원래였으면 해당 내용을 바로 사용했을건데 다항 회귀를 하는것이기에 가상의 열 몇개를 추가하고 

    데이터프레임에 넣어준다.  

-> from sklearn.preprocessing import PolynomialFeatures #다항속성을 만들어주는 틀

-> PolynomialFeatures(2) 2차 함수를 의미 

-> transform을 하고 나면 polynomial_data.shape (506, 13) -> (506, 105) 열이 늘어난것을 알 수 있다. 

 

-> 확인해보면 polynomial_feature_names 가능한 모든 2차 조합이 출력되는 것을 알 수 있다. 

-> 이제 해당 내용으로 데이터프레임을 만든다면! 

-> x = pd.DataFrame(polynomial_data, columns = polynomial_feature_names)

-> 다항 회귀를 위한 데이가 준비 되었다. 

-> 그럼 이제 여기서부터는 다중선형회귀와 방법이 똑같다! 

-> input을 x 에 저장해 두었다면 output은 pd.DataFrame(boston_dataset.target, columns=['MEDV'])

 

-> 그리고 학습을 했다면 학습 결과를 보고싶다면 model.coef_ , model.intercept_

-> 이제 만든 모델의 성능을 확인해보자! y_test_prediction = model.predict(x_test)

 

-> 그리고 평균제곱근 오차를 통해서 실제 output과 얼마나 괴리가 있는지 확인! 

-> mean_squared_error(y_test, y_test_prediction) ** 0.5

-> 3.1965276513355376

 

이 모델로 집 가격을 예측하면 오차가 약 3200 달러 정도 된다는 것이다. 

 

---- 

 

그럼 실습으로 다항 회귀로 당뇨병 예측하는 모델 학습을 해보았다!!

# 필요한 라이브러리 import
from sklearn import datasets
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

import pandas as pd  

diabetes_dataset = datasets.load_diabetes()

polynomial_transformer = PolynomialFeatures(2)
polynomial_data = polynomial_transformer.fit_transform(diabetes_dataset.data)
polynomial_feature_names = polynomial_transformer.get_feature_names(diabetes_dataset.feature_names)
X = pd.DataFrame(polynomial_data, columns = polynomial_feature_names)

# 목표 변수
y = pd.DataFrame(diabetes_dataset.target, columns=['diabetes'])

# 코드를 쓰세요
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)
model = LinearRegression()
model.fit(X_train, y_train)
y_test_predict = model.predict(X_test)

mse = mean_squared_error(y_test, y_test_predict)
mse ** 0.5

 코딩실습[코드잇] 파이썬 머신 러닝 강의를 들으면 공부내용을 적어봤습니다.

728x90
반응형

댓글