빅데이터 분석기사/작업 유형 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