Python 데이터 분석

선형회귀분석 모델 LinearRegression을 사용 예제(train_test_split)

코딩탕탕 2022. 11. 16. 16:06

 

 

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler # 정규화 지원
from sklearn.metrics import r2_score, explained_variance_score, mean_squared_error
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
# sklearn에는 독립변수가 백터가 아닌 matrix로 넣어진다.

# 공부시간에 따른 시험 점수 예측모델
df = pd.DataFrame({'study_time':[3, 4, 5, 8, 10, 5, 8, 6, 3, 6, 10, 9, 7, 0, 1, 2], 
                       'score':[76, 74, 74, 89, 95, 84, 82, 70, 60, 88, 80, 50, 85, 50, 60, 79]})
print(df)

# 데이터세트 분리 : train / test split - 모델의 과적합(overfitting) 방지가 목적
train, test = train_test_split(df, test_size = 0.4, shuffle = True, random_state = 12) # 6 : 4 로 분리
x_train = train[['study_time']] # 모델 학습용
y_train = train['score']
x_test = test[['study_time']] # 모델 검증용
y_test = test['score']
print(x_train)
print(y_train)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape) # (9, 1) (7, 1) (9,) (7,)

print()
model = LinearRegression()
model.fit(x_train, y_train) # 학습은 train data로 실시

y_pred = model.predict(x_test) # 검정은 test data로 실시
print('예측값 :', y_pred)
print('실제값 :', y_test.values)

print('결정계수로 모델 성능을 확인')
print('결정계수 :', r2_score(y_test, y_pred)) # test data를 사용  0.2151 의 설명력

print('---------')
# 참고 : 결정계수는 표본 데이터가 많을 수록 그 수치 또한 증가한다.

def linearFunc(df, test_size):
    train, test = train_test_split(df, test_size = test_size, shuffle = True, random_state = 12) # 6 : 4 로 분리
    x_train = train[['study_time']] # 모델 학습용
    y_train = train['score']
    x_test = test[['study_time']] # 모델 검증용
    y_test = test['score']
    # print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
    model = LinearRegression().fit(x_train, y_train) # 학습은 train data로 실시
    y_pred = model.predict(x_test) # 검정은 test data로 실시
    print('결정계수 :', r2_score(y_test, y_pred).round(2)) # test data를 사용
    print('test data 비율 : 전체 데이터의 {}%'.format(i * 100))
    # 시각화
    sns.scatterplot(x=df['study_time'], y=df['score'], color = 'green')
    sns.scatterplot(x=x_test['study_time'], y=y_test, color = 'red')
    sns.lineplot(x=x_test['study_time'], y=y_pred, color = 'blue')
    plt.show() # 결정계수 값은 데이터의 수에 따라 적절한 값을 찾아가게 됨



y_pred = model.predict(x_test)

test_size = [0.1, 0.2, 0.3, 0.4, 0.5] # train, test 비율을 반복문 돌려서 출력해보기
for i in test_size:
    linearFunc(df, i)
    
    
<console>
    study_time  score
0            3     76
1            4     74
2            5     74
3            8     89
4           10     95
5            5     84
6            8     82
7            6     70
8            3     60
9            6     88
10          10     80
11           9     50
12           7     85
13           0     50
14           1     60
15           2     79
    study_time
13           0
0            3
10          10
3            8
2            5
1            4
6            8
15           2
11           9
13    50
0     76
10    80
3     89
2     74
1     74
6     82
15    79
11    50
Name: score, dtype: int64
(9, 1) (7, 1) (9,) (7,)

예측값 : [72.16166282 69.8891455  73.29792148 67.61662818 73.29792148 77.84295612
 74.43418014]
실제값 : [84 60 88 60 70 95 85]
결정계수로 모델 성능을 확인
결정계수 : 0.21519697375066027
---------
결정계수 : 0.31
test data 비율 : 전체 데이터의 10.0%
결정계수 : 0.41
test data 비율 : 전체 데이터의 20.0%
결정계수 : 0.37
test data 비율 : 전체 데이터의 30.0%
결정계수 : 0.22
test data 비율 : 전체 데이터의 40.0%
결정계수 : -0.2
test data 비율 : 전체 데이터의 50.0%

 

test data의 비율 10%

 

test data의 비율 20%

 

test data의 비율 30%

 

test data의 비율 40%

 

test data의 비율 50%