빅데이터 분석기사/작업 유형 2 (ML)

Machine Learning 사전 학습 2 데이터 분할, 학습, 아들키 예측

유방울 2023. 5. 27. 22:28

자녀의 키 예측 

부모의 키를 사용해 자녀의 키 예측하는 회귀 모델 작성

 

아들키 예측

# 이건 작성 안 해도 됨
# 나중에 줄 것임
import pandas as pd

data_train = {'아빠' : [175, 180, 172, 174, 178, 168, 173, 177],
        '엄마' : [160, 158, 155, 161, 163, 160, 168, 167],
        '아들' : [178, 182, 175, 180, 183, 174, 179, 183],
        '딸' : [163, 168, 157, 164, 167, 158, 169, 169]}
df = pd.DataFrame(data_train)

# 인덱스는 id
df.index.name = 'id'
# 입력값
df[['아빠', '엄마']].to_csv('X_train.csv')
# 출력값 
df[['아들']].to_csv('Y1_train.csv')
# 혼자 실습할 때 사용하기
df[['딸']].to_csv('Y2_train.csv')

# 변경가능
data_test = {'아빠' : [174, 179, 180],
             '엄마' : [160, 160, 160]}
df2 = pd.DataFrame(data_test)
df2.index.name = 'id'   
df2.to_csv('X_test.csv')
# [0] train, test 파일 가져오기
X_train = pd.read_csv('X_train.csv')
Y1_train = pd.read_csv('Y1_train.csv')
X_test = pd.read_csv('X_test.csv')

# 확인하는 작업 필요
print(X_train)
   id   아빠   엄마
0   0  175  160
1   1  180  158
2   2  172  155
3   3  174  161
4   4  178  163
5   5  168  160
6   6  173  168
7   7  177  167

corr() : 상관관계 확인

# [1] 아빠, 엄마, 아들 키의 상관관계
# 양의 상관관계, 1에 가까울 수록 관계 큼
# 아빠가 가장 강함
df = X_train.copy()
df['아들'] = Y1_train['아들']
print(df.corr())

          id        아빠        엄마        아들
id  1.000000 -0.223880  0.773127  0.168862
아빠 -0.223880  1.000000  0.133983  0.895192
엄마  0.773127  0.133983  1.000000  0.491595
아들  0.168862  0.895192  0.491595  1.000000

X: 아빠, 엄마의 키

Y1 : 아들의 키

Y2 :딸의 키

# [2] 데이터 지정하기
# 아빠, 엄마의 키를 사용해 아들의 키를 예측 (X=[아빠, 엄마], Y1=[아들])
# 나중에는 평가 데이터도 나눔 
X = df[['아빠','엄마']]
Y1 = df['아들']
print(Y1)

0    178
1    182
2    175
3    180
4    183
5    174
6    179
7    183
Name: 아들, dtype: int64

model.fit(엄마와 아빠 키, 예측 키)

# [3] 아들 키를 예측하는 모델 만들어 분석하기
# 이런 코드를 암기해야 함
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X,Y1)

LinearRegression()

model.score(엄마와 아빠 키, 예측 키)

# [4] 아들 모델 성능 평가하기
# 회귀모델에서는 R2 스코어 확인
# 1에 가까울 수록 좋음
model.score(X,Y1)

0.9420204329984175

mode.predict(엄마와 아빠 키)

# [5] 결과를 표로 작성하기 (예측, 오차)
# 모델 예측 반드시 2차원이어야 함
result = df[['아빠', '엄마','아들']]
result['아들예측'] = model.predict(X)
result['아들오차'] = result['아들'] - result['아들예측']
result

	아빠	엄마	아들	아들예측	아들오차
0	175	160	178	179.091446	-1.091446
1	180	158	182	182.354761	-0.354761
2	172	155	175	175.281252	-0.281252
3	174	161	180	178.618029	1.381971
4	178	163	183	182.304154	0.695846
5	168	160	174	173.686325	0.313675
6	173	168	179	179.937067	-0.937067
7	177	167	183	182.726965	0.273035
# [6] 새로운 데이터로 예측하기
아빠키 = int(input('아빠키를 입력해 주세요 : '))
엄마키 = int(input('엄마키를 입력해 주세요 : '))
# X 순서와 동일해야 함
data = [[아빠키, 엄마키]]
아들키 = model.predict(data)
print(f'아들의 예상키는 {아들키[0]}입니다')

아빠키를 입력해 주세요 : 181
엄마키를 입력해 주세요 : 155
아들의 예상키는 182.23069314463976입니다
# [7] 새로운 데이터로 확인하기 - X_test.csv 로 확인하기
# X 데이터에는 id 칼럼이 없다
print(X_test)

   id   아빠   엄마
0   0  174  160
1   1  179  160
2   2  180  160
Xt = X_test[['아빠','엄마']]
print(Xt)
# 0, 1, 2의 결과
model.predict(Xt)

    아빠   엄마
0  174  160
1  179  160
2  180  160
array([178.31928593, 182.18008636, 182.95224644])