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

머신 러닝 선형 회귀 (Linear Regression) #3 - scikit-learn 을 이용해 집 값 예측 프로그램 구현하기

by grey-hat hacker 2021. 2. 2.
728x90

# scikit-learn

# sklearn 

-> 머신러닝 라이브러리들이 있다. 머신러닝 알고리즘을 넣어놔서 불러와 사용하면 된다. 

C:\Users\user\AppData\Local\Programs\Python>pip3 install scikit-learn

- 데이터 준비하기 

# scikit-learn 

공부하는 사람들을 위해서 교육용 데이터가 포함되어있다.  

>>> from sklearn.datasets import load_boston  # boston 집 값 데이터를 불러온다. 
>>> boston_dataset = load_boston() # boston 함수 호출 

>>> boston_dataset.DESCR # 해당 데이터셋의 내용을 확인 할 수 있다. 

Number of Instances: 506 :Number of Attributes: 13

numeric/categorical predictive. Median Value (attribute 14) is usually the target.

여러 속성들이 있고 13개가 입력 변수이고, 14번째가 우리의 목표 변수이다. 

 

>>> boston_dataset.feature_names  # 각각의 속성들을 확인할 수 있다. 
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')

>>> boston_dataset.data  #각각의 데이터를 확인할 수 있다. 

array([[6.3200e-03, 1.8000e+01, 2.3100e+00, ..., 1.5300e+01, 3.9690e+02,
        4.9800e+00],
       [2.7310e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9690e+02,
        9.1400e+00],
       [2.7290e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9283e+02,
        4.0300e+00], 

 

 

>>> from sklearn.datasets import load_boston
>>> boston_dataset = load_boston()
>>> boston_dataset.DESCR
".. _boston_dataset:\n\nBoston house prices dataset\n---------------------------\n\n*\
*Data Set Characteristics:**  \n\n    :Number of Instances: 506 \n\n    
:Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.\n\n    :Attribute Information (in order):\n        
- CRIM     per capita crime rate by town\n        
- ZN       proportion of residential land zoned for lots over 25,000 sq.ft.\n        - INDUS    proportion of non-retail business acres per town\n        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n        - NOX      nitric oxides concentration (parts per 10 million)\n        - RM       average number of rooms per dwelling\n        - AGE      proportion of owner-occupied units built prior to 1940\n        - DIS      weighted distances to five Boston employment centres\n        - RAD      index of accessibility to radial highways\n        - TAX      full-value property-tax rate per $10,000\n        - PTRATIO  pupil-teacher ratio by town\n        - B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town\n        - LSTAT    % lower status of the population\n        - MEDV     Median value of owner-occupied homes in $1000's\n\n    :Missing Attribute Values: None\n\n    :Creator: Harrison, D. and Rubinfeld, D.L.\n\nThis is a copy of UCI ML housing dataset.\nhttps://archive.ics.uci.edu/ml/machine-learning-databases/housing/\n\n\nThis dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.\n\nThe Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic\nprices and the demand for clean air', J. Environ. Economics & Management,\nvol.5, 81-102, 1978.   Used in Belsley, Kuh & Welsch, 'Regression diagnostics\n...', Wiley, 1980.   N.B. Various transformations are used in the table on\npages 244-261 of the latter.\n\nThe Boston house-price data has been used in many machine learning papers that address regression\nproblems.   \n     \n.. topic:: References\n\n   - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.\n   - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.\n"

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

>>> boston_dataset.data
array([[6.3200e-03, 1.8000e+01, 2.3100e+00, ..., 1.5300e+01, 3.9690e+02,
        4.9800e+00],
       [2.7310e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9690e+02,
        9.1400e+00],
       [2.7290e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9283e+02,
        4.0300e+00],
       ...,
       [6.0760e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,
        5.6400e+00],
       [1.0959e-01, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9345e+02,
        6.4800e+00],
       [4.7410e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,
        7.8800e+00]])
        
       ## 데이터 구분이 어려워서 pandas를 추가해준다.  
        
>>> from sklearn.datasets import load_boston     
>>> import pandas as pd

>>> boston_dataset = load_boston()
>>> x = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
>>> x
        CRIM    ZN  INDUS  CHAS    NOX  ...  RAD    TAX  PTRATIO       B  LSTAT
0    0.00632  18.0   2.31   0.0  0.538  ...  1.0  296.0     15.3  396.90   4.98
1    0.02731   0.0   7.07   0.0  0.469  ...  2.0  242.0     17.8  396.90   9.14
2    0.02729   0.0   7.07   0.0  0.469  ...  2.0  242.0     17.8  392.83   4.03
3    0.03237   0.0   2.18   0.0  0.458  ...  3.0  222.0     18.7  394.63   2.94
4    0.06905   0.0   2.18   0.0  0.458  ...  3.0  222.0     18.7  396.90   5.33
..       ...   ...    ...   ...    ...  ...  ...    ...      ...     ...    ...
501  0.06263   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  391.99   9.67
502  0.04527   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  396.90   9.08
503  0.06076   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  396.90   5.64
504  0.10959   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  393.45   6.48
505  0.04741   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  396.90   7.88

[506 rows x 13 columns]

pandas 를 사용해서 행과 열에 505개의 데이터 값과 각 속성들을 적용시켰다.

 - 지금까지 학습한 내용으로는 입력변수가 하나인 것만 보고 있으므로 하나를 기준으로 한다. 

>>> x = x[['AGE']]
>>> x
      AGE
0    65.2
1    78.9
2    61.1
3    45.8
4    54.2
..    ...
501  69.1
502  76.7
503  91.0
504  89.3
505  80.8

[506 rows x 1 columns]
>>> y = pd.DataFrame(boston_dataset.target, columns=['NEDV'])
>>> y
     NEDV
0    24.0
1    21.6
2    34.7
3    33.4
4    36.2
..    ...
501  22.4
502  20.6
503  23.9
504  22.0
505  11.9

[506 rows x 1 columns]

 - 입력 변수를 설정했고 

 - 목표 변수(NEDV)를 이용해서 y 를 생성하였다. 

 

tip. 모델의 성능을 신빙성 있게 평가하기 위해서 모델을 학습시키는 데이터 모델을 평가하는 데이터로 나눈다.

>>> from sklearn.model_selection import train_test_split #데이터를 트레이닝 셋 테스트 셋으로 나눠준다. 
>>> x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=5)

# x 입력변수, y 목표변수 , 전체 데이터 중 20프로만 테스트 셋으로 사용해라,

# 5로 고정시 테스트 변수가 고정  입력 값 없이 넘기면 매번 새로운 테스트 셋으로 설정 

 

>>> x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=5)
>>> print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
(404, 1) (102, 1) (404, 1) (102, 1)

테스트 셋에는 20%인 102개가 들어간 것을 알 수 있다. 

 

- 트레이닝 셋을 이용해서 선형회귀 모델을 학습시키기 위해서 선형회귀 모델을 불러와야한다. 

>>> from sklearn.linear_model import LinearRegression

>>> model = LinearRegression()

>>> model.fit(x_train, y_train) # 이렇게만 해도 학습이 끝난다. 

>>> model.coef_  #  θ1의 값이 나온다. 
array([[-0.12402883]])
>>> model.intercept_ #  θ0의 값이 나온다. 
array([31.04617413])

 

결론 = f(x) = 31.04617413 -0.12402883x -> 우리가 구한 최적선이 된다. 

 

- 그럼 이제 최적선이 잘 되어있는지 테스트 셋을 이용해 확인해보면 된다. 

>>> y_test_prediction = model.predict(x_test)
>>> y_test_prediction
array([[20.31768041],
       [28.14389953],
       [22.84786852],
       [18.64329122],
       [24.62148078],
       [19.99520545],
       [19.75955068],
       [22.79825699],
       [20.92542167],
       [21.74401194],
       [23.29437231],
       [25.41526529],
       [21.53316293],

x_test를 이용해서 목표값을 예측해보았다. 

그럼 실제 변수 y_test 에 있는 값과 일치하는지 확인을 해보고 싶다. 

 

- 평균 제곱근 오차를 이용하면 된다. 

>>> from sklearn.metrics import mean_squared_error

>>> mean_squared_error(y_test, y_test_prediction) ** 0.5

y_test = x_test에 대한 목표값

y_test_prediction = 선형함수를 이용하여 예측으로 구한 목표값 

루트는 0.5제곱과 같으니 = ** 0.5

 

>>> mean_squared_error(y_test, y_test_prediction) ** 0.5
8.236881612652455

 

# 해당 함수를 이용하여 집 값을 구하면 약 8천달러 정도의 오차가 있을 수 있다는 뜻이다.

 

- 최종 코드 

>>> from sklearn.datasets import load_boston     
>>> 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()
>>> x = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
>>> x
        CRIM    ZN  INDUS  CHAS    NOX  ...  RAD    TAX  PTRATIO       B  LSTAT
0    0.00632  18.0   2.31   0.0  0.538  ...  1.0  296.0     15.3  396.90   4.98
1    0.02731   0.0   7.07   0.0  0.469  ...  2.0  242.0     17.8  396.90   9.14
2    0.02729   0.0   7.07   0.0  0.469  ...  2.0  242.0     17.8  392.83   4.03
3    0.03237   0.0   2.18   0.0  0.458  ...  3.0  222.0     18.7  394.63   2.94
4    0.06905   0.0   2.18   0.0  0.458  ...  3.0  222.0     18.7  396.90   5.33
..       ...   ...    ...   ...    ...  ...  ...    ...      ...     ...    ...
501  0.06263   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  391.99   9.67
502  0.04527   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  396.90   9.08
503  0.06076   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  396.90   5.64
504  0.10959   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  393.45   6.48
505  0.04741   0.0  11.93   0.0  0.573  ...  1.0  273.0     21.0  396.90   7.88

[506 rows x 13 columns]

>>> x = x[['AGE']]
>>> y = pd.DataFrame(boston_dataset.target, columns=['NEDV'])

>>> x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=5)
>>> print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
(404, 1) (102, 1) (404, 1) (102, 1)

>>> 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
8.236881612652455

 - 추가적으로 범죄율을 이용한 집 값 예측 프로그램 

from sklearn import datasets
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_house_dataset = datasets.load_boston()

# 입력 변수를 사용하기 편하게 pandas dataframe으로 변환
X = pd.DataFrame(boston_house_dataset.data, columns=boston_house_dataset.feature_names)

# 목표 변수를 사용하기 편하게 pandas dataframe으로 변환
y = pd.DataFrame(boston_house_dataset.target, columns=['MEDV'])

X = X[['CRIM']]  # 범죄율 열만 사용

# train_test_split를 사용해서 주어진 데이터를 학습, 테스트 데이터로 나눈다
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=5)

linear_regression_model = LinearRegression()  # 선형 회귀 모델을 가지고 오고 
linear_regression_model.fit(X_train, y_train)  # 학습 데이터를 이용해서 모델을 학습 시킨다

y_test_predict = linear_regression_model.predict(X_test)  # 학습시킨 모델로 예측

# 평균 제곱 오차의 루트를 통해서 테스트 데이터에서의 모델 성능 판단
mse = mean_squared_error(y_test, y_test_predict)

mse ** 0.5

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

728x90
반응형

댓글