빅데이터 분석기사/작업 유형 2 (ML)
sample 생성 함수 & 모델 학습 및 성능 평가 함수
유방울
2023. 6. 2. 14:47
import
# 사용할 라이브러리 import
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
sample 생성 모델
# sample로 사용할 DataSet을 생성하는 함수 작성
# X: 국어, 영어, 수학 점수
# Y: 합격여부 (X의 평균 60이상, 과락 40점 미만)
# seedno : 랜덤 수 생성 규칙
# size : 랜덤 수 생성 행의 수
# step=0 (균형), step=다른수 (불균형)
def make_sample(seedno, size, step=0):
colnames = ['국어','영어','수학']
A = np.random.randint(0, 101, (size, 3))
df = pd.DataFrame(A, columns=colnames)
df['합격여부'] = (df.mean(axis=1)>=60) & (df.min(axis=1)>=40)
df['합격여부'].value_counts()
# 스텝이 0이면 합격데이터 추가하기
if step ==0:
F, T = df['합격여부'].value_counts()
B = np.random.randint(60, 101,(F-T, 3))
# df2는 전체 합격임
df2 = pd.DataFrame(B, columns=colnames)
df2['합격여부'] = True
# df + df2 합치고 df라고 이름 지정
df = pd.concat([df, df2])
df['합격여부'].value_counts()
# 새로 만들어진 인덱스를 변경해줘야 함
df.index = pd.RangeIndex(len(df))
df['합격여부'] = df['합격여부'].replace({True:1, False:0}) # 합격 1, 불합격 0
return df
균형 데이터로!
# 균형 데이터
# 무조건 20000으로 나오지는 않음
data = make_sample(1234, 20000)
data['합격여부'].value_counts()
1 16369
0 16369
Name: 합격여부, dtype: int64
step =1은 불균형 데이터
# step =1 이면 불균형 데이터
data = make_sample(1234, 20000, step =1)
data['합격여부'].value_counts()
0 16411
1 3589
Name: 합격여부, dtype: int64
모델 학습, 성능 평가 함수 ~!
shape 은 확인만 하는 작업
# 모델 학습 및 성능 평가 함수 생성 중요 중요 중요
def ModelTrain(model, data):
# 1) X, Y 데이터 분리
# X = data.iloc[:,:-1]
# Y = data.iloc[:,-1]
Y = data['합격여부']
X = data.drop(columns=['합격여부'])
# 2) 학습, 평가 데이터 분리
x_train, x_test, y_train, y_test = train_test_split(X, Y,
test_size = 0.2,
stratify = Y,
random_state=0)
# 3) 분리된 데이터 shape 출력
print([x.shape for x in [x_train, x_test, y_train, y_test]])
# 4) 학습 모델 선택, 학습
# max_itet 최대 반복횟수
# model = LogisticRegression(max_iter=1000)
model.fit(x_train, y_train)
# 5) 성능평가 - 정확도
print('train 성능:', model.score(x_train, y_train))
print('test 성능:', model.score(x_test, y_test))
return model