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%