본문 바로가기
파이썬/딥러닝

파이썬 딥러닝 - 회귀, 분류, 다중분류 (tensorflow.keras

by 큰고양2 2023. 10. 7.

import 

#판다스와 기본 그래프 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#전처리 도구
from sklearn.model_selection import train_test_split
from sklearn.metrics import *
from sklearn.preprocessing import MinMaxScaler
#딥러닝 도구
from keras.models import Sequential
from keras.layers import Dense
from keras.backend import clear_session
from keras.optimizers import Adam

위 코드로 필요한 라이브러리를 로딩한다

 

데이터 전처리

분류의 y 데이터 처리

데이터분류를 하는 경우 결과값을 숫자로 바꿔줘야하는데

이진 분류의 경우 0과 1로 바꿔주고

다중 분류의 경우 각각 숫자를 할당하여 정해주거나(정수 인코딩) , one-hot 인코딩으로 처리를 해주어야한다

#이진 분류

data['타겟'] = np.where(data['타겟']=='1로 지정할 범주값', 1, 0)


#다중 분류 정수 인코딩

# 임포트
from sklearn.preprocessing import LabelEncoder

# 선언 및 인스턴스화
int_encoder = LabelEncoder()

# 인코딩
data['타겟'] = int_encoder.fit_transform(data['타겟'])



#다중 분류 one-hot 인코딩

# 임포트
from sklearn.preprocessing import OneHotEncoder

# 선언 및 인스턴스화
encoder = OneHotEncoder()

# 데이터를 2D 배열로 변환 (reshape)
data_encoded = encoder.fit_transform(data['타겟'].values.reshape(-1, 1))

# 희소 행렬을 밀집 배열로 변환
data_encoded = data_encoded.toarray()

# 결과를 DataFrame에 할당
data_encoded_df = pd.DataFrame(data_encoded, columns=encoder.get_feature_names_out(['타겟']))

# 원핫 인코딩된 열을 원본 데이터프레임에 추가
data = pd.concat([data, data_encoded_df], axis=1)

# '타겟' 열 삭제 (원핫 인코딩 후)
data = data.drop(['타겟'], axis=1)

다중 분류의 경우 정수 인코딩이나 원핫 인코딩을 선택해서 고르면 된다

다만 모델에 따라 성능 차이가 있을 수 있기 때문에 적절한 것을 골라야 한다

 

 

 

데이터에서 타겟 데이터와 나머지 데이터를

x 데이터와 y데이터(타겟) 으로 분리한다

 

결측치 처리

https://bigcat5312.tistory.com/35

 

파이썬 기초 판다스 데이터 프레임 결측치 찾기, 제거하기, 채우기

결측치 찾기 결측치는 데이터프레임.isnull() 을 사용하면 결측치는 True, 유효값은 False로 확인 할 수 있다 isnull() 대신, isna()를 사용해도 된다 데이터프레임.notnull()을 사용하면 유효값은 True 결측

bigcat5312.tistory.com

게시글 참고

 

 

가변수화

https://bigcat5312.tistory.com/36

 

파이썬 기초 판다스 데이터 프레임 가변수화 -get_dummies

get_dummies 를 이용하면 범주형 값을 0이나 1로 가변수화를 시킬 수 있다 사용하는 방법은 판다스를 임포트 한 후 pd.get_dummies(데이터프레임, columns= 열 이름, drop_first = ) 형태로 사용하면 된다 columns

bigcat5312.tistory.com

게시글을 참고하여 x 데이터의 범주형 데이터의 가변수화를 진행하자

 

데이터 분할

결측치 처리와 가변수화를 진행했다면

https://bigcat5312.tistory.com/80

 

파이썬 머신러닝 지도학습 - 데이터 분리 (sklearn - train_test_split

import from sklearn.model_selection import train_test_split train_test_split 데이터를 머신러닝에 사용하기 위해서 학습 데이터와 테스트 데이터를 무작위로 분리하는 함수로 train_test_split(x , y, test_size = or train_siz

bigcat5312.tistory.com

코드를 참고하여 train 데이터와 test 데이터를 분리하자

 

스케일링

https://bigcat5312.tistory.com/94

 

파이썬 머신러닝 데이터 정규화

https://bigcat5312.tistory.com/80 파이썬 머신러닝 지도학습 - 데이터 분리 (sklearn - train_test_split import from sklearn.model_selection import train_test_split train_test_split 데이터를 머신러닝에 사용하기 위해서 학습 데

bigcat5312.tistory.com

마지막으로 스케일링까지 진행했다면 데이터 전처리는 끝이 난다

 

코드로 요약을 하자면

#이진 분류

data['타겟'] = np.where(data['타겟']=='1로 지정할 범주값', 1, 0)


#다중 분류 정수 인코딩

# 임포트
from sklearn.preprocessing import LabelEncoder

# 선언 및 인스턴스화
int_encoder = LabelEncoder()

# 인코딩
data['타겟'] = int_encoder.fit_transform(data['타겟'])



#다중 분류 one-hot 인코딩

# 임포트
from sklearn.preprocessing import OneHotEncoder

# 선언 및 인스턴스화
encoder = OneHotEncoder()

# 데이터를 2D 배열로 변환 (reshape)
data_encoded = encoder.fit_transform(data['타겟'].values.reshape(-1, 1))

# 희소 행렬을 밀집 배열로 변환
data_encoded = data_encoded.toarray()

# 결과를 DataFrame에 할당
data_encoded_df = pd.DataFrame(data_encoded, columns=encoder.get_feature_names_out(['타겟']))

# 원핫 인코딩된 열을 원본 데이터프레임에 추가
data = pd.concat([data, data_encoded_df], axis=1)

# '타겟' 열 삭제 (원핫 인코딩 후)
data = data.drop(['타겟'], axis=1)




#x,y 분리
target = '타겟 컬럼 명'

x = data.drop(target , axis=1)
y = data[target]

#결측치 처리

x.dropna(axis=0 , inplace=true , subset=기준 열 ) #결측치 있는 행 제거

또는
x.fillna('채울값', inplace = true )  #결측치를 특정 값으로 채움


#가변수화

dum_cols = [  범주형 데이터 컬럼 명들  ]
x = pd.get_dummies(x, columns = dum_cols ,drop_first = True)


#데이터 분할

x_train, x_val, y_train, y_val = train_test_split(x, y, test_size= 테스트 데이터를 얼마나 분할 할지) #테스트 데이터를 20퍼센트 분할


#스케일링

scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_val = scaler.transform(x_val)

이 되겠다

 

 

 

 

 

 

 

 

모델링

nfeaters = x.shape[1]  # x의 컬럼 수

clear_sesstion() #메모리 초기화

#모델 정의 (히든 레이어가 없는 경우
model =  Sequential( [Dense(값, input_shape = (nfeaters, ) , activation = ) ])

#모델 정의 (히든 레이어가 1개
model = model = Sequential( [Dense(값  , input_shape = (nfeaters, ) , activation = ),
                            Dense(값 , activation = )])
#모델 정의 (히든 레이어가 2개
model = model = Sequential( [Dense(값  , input_shape = (nfeaters, ) , activation = ),
                            Dense(값 , activation = ),
                            Dense(값 , activation = )])



#모델 컴파일
model.compile( optimizer= Adam(learning_rate=0.001) , loss =  )

#모델 학습 및 히스토리 저장

hist = model.fit(x_train, y_train, epochs=50 , validation_split=0.2).history

#예측
y_pred = model.predict(x_val)


#예측값 변환-이진 분류
y_pred = np.where(y_pred>= 0.5, 1, 0)

#예측값 변환-다중 분류
y_pred = y_pred.argmax(axis=1)

기본적인 모델의 형태다

여기서 목적에 맞게 모델의 코드를 수정해주면 된다

모델 정의 부분에서는 히든 레이어를 사용하는 경우와 사용하지 않는 경우를 나누어 두었는데

히든레이어를 사용하지 않는 경우 바로 아웃풋 레이어를 정의해야하므로

 

Dense의 값에는 결과의 수를 정의 하면 된다 (회귀 = 1 , 이진분류 = 2, 다중분류 = 결과의 수)

 

input_shape는 처음 값을 입력받는 레이어에만 적어주면 되고 (입력 컬럼수, ) 형태로 적어주면 된다

 

activation과 complie의 loss는 다음 표를 참고해서 넣어주면 된다

구분 activation loss
히든레이어 아웃풋 레이어
회귀 ‘relu’ 없음 ‘mse’
이진 분류 ‘sigmoid’ ‘binary_crossentropy’
다중 분류 ‘softmax' ‘sparse_categorial_crossentrophy’ -정수
‘categorial_crossentrophy’
-onehot

fit의 epochs는 원하는 학습 횟수를 지정하면 되고, validation_split도 원하는 검증 데이터 비율을 적어주자

 

마지막으로 예측값 변환코드를 목적에 맞게 사용해주면 된다

 

평가

from sklearn.metrics import *

코드로 평가 함수들을 임포트 한 다음

https://bigcat5312.tistory.com/77

 

머신러닝 지도학습 - 회귀와 분류, 분석도구

회귀(Regression) 이미 결과값이 있는 데이터를 사용하여 연관성을 찾아 연속적인 숫자를 예측해 내는 것 ex) 집값 분석도구 평가도구 LinearRegression KNeighborsRegressor DecisionTreeRegressor RandomForestRegressor XG

bigcat5312.tistory.com

게시글을 참고하여 원하는 평가함수(y_test , y_pred)를 사용해 평가 할 수 있다

 

 

+ 학습 히스토리 그래프

 

def dl_history_plot(history):
    plt.figure(figsize=(10,6))
    plt.plot(history['loss'], label='train_err', marker = '.')
    plt.plot(history['val_loss'], label='val_err', marker = '.')

    plt.ylabel('Loss')
    plt.xlabel('Epoch')
    plt.legend()
    plt.grid()
    plt.show()
    
dl_history_plot(history)

위의 함수를 사용하여 빠르게 학습 히스토리를 확인 할 수 있다

ex)