(1) y 값을 0,1,2로 변환하기

data['Species'] = data['Species'].map({'setosa':0, 'versicolor':1, 'virginica':2})
data.head()

 

(1) 모델 설계

data['Species'] = data['Species'].map({'setosa':0, 'versicolor':1, 'virginica':2})
data.head()target = 'Species'
x = data.drop(target, axis = 1)
y = data.loc[:, target]

x_train, x_val, y_train, y_val = train_test_split(x, y, test_size = .3, random_state = 20)

nfeatures = x_train.shape[1] #num of columns
nfeatures

# 메모리 정리
clear_session()

# Sequential 
model = Sequential( Dense( 3 , input_shape = (nfeatures,), activation = 'softmax') )

# 모델요약
model.summary()

 

 

(2) compile + 학습

model.compile(optimizer=Adam(learning_rate=0.1), loss= 'sparse_categorical_crossentropy')

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

 

(3) 예측 및 검증

pred = model.predict(x_val)
pred[:5]

# 5개 행만 살펴보면
np.argmax(pred[:5], axis = 1)

# 전체에 적용해서 변환합시다.
pred_1 = pred.argmax(axis=1)
pred_1

y_val

print(confusion_matrix(y_val, pred_1))
print(classification_report(y_val, pred_1))

 

 

 

모델 저장 및 사용

## DNN
## 1) 불러오기

from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.backend import clear_session
from sklearn.metrics import accuracy_score

# 메모리 정리
clear_session()

## 2) 선언하기
nfeatures = train_x.shape[1] #num of columns
model_DNN = Sequential()

# 스케일링
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
train_x = scaler.fit_transform(train_x)
test_x =scaler.transform(test_x)

# 입력 레이어
model_DNN.add(Dense(8, activation='relu'))
# model_DNN.add(Dropout(0.5)) # Dropout은 신경망에서 뉴런의 일부를 무작위로 비활성화하여 과적합을 방지

#은닉 레이어
model_DNN.add(Dense(6, activation='relu'))
# model_DNN.add(Dropout(0.3))

# 출력 레이어
model_DNN.add(Dense(4,input_shape = (nfeatures,) ,activation='softmax'))

## target값 라벨링하기 {'뇌경색':0, '뇌출혈':1, '복부손상':2, '심근경색':3}

labeling = {'뇌경색':0, '뇌출혈':1, '복부손상':2, '심근경색':3}

train_y_1 = train_y.replace(labeling)
test_y_1 = test_y.replace(labeling)
## 3) 학습하기

model_DNN.compile(optimizer='adam', loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])
history = model_DNN.fit(train_x,train_y_1, epochs = 1000, validation_split = 0.2).history

## 4) 예측하기
pred_DNN =  model_DNN.predict(test_x)

## 5) 평가하기, np.argmax(pred_DNN, axis=1)

pred_DNN = np.argmax(pred_DNN, axis=1)

print(accuracy_score(test_y_1, pred_DNN))

## 모델 저장하기

#머신러닝 모델인 경우
import joblib
joblib.dump(model_XGC, '119_model_XGC.pkl')

#딥러닝 모델인 경우
model_DNN.save('119_model_DNN.keras')

# 모델 불러오기

# 머신러닝 모델인 경우

# import joblib
# model_m = 

# 딥러닝 모델인 경우

from keras.models import load_model
model_d = load_model('119_model_DNN.keras')

 

KT Aivle School 에이블스쿨 중간점검] 데이터전처리, 불필요한 부분 제거, 결측치 대체, 중앙값, 최빈값

진행단계

  • 먼저 필요한 라이브러리들을 불러오자 - 데이터 전처리, 시각화
  • 데이터를 불러오고 데이터를 확인하자
  • 불필요한 부분을 제거하자
  • 데이터 결측치를 처리하자 - 최빈값으로 대체하자
  • 데이터 결측치를 처리하자 - 중앙값으로 대체하자

 

먼저 필요한 라이브러리들을 불러오자 - 데이터 전처리, 시각화

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

%matplotlib inline의 역할은 이와 같다.

 

데이터를 불러오고 데이터를 확인하자

df = pd.read_csv('voc_data.csv')   # csv 파일을 읽어오자                         
df.head()  # 앞부분 5줄을 출력하자                                                                  
df.tail()  # 뒷부분 5줄을 출력하자                                                                      
df.info()  # 데이터의 정보를 종합적으로 확인하자
df.info()     
df.index() # 데이터프레임의 인덱스 확인

df.columns # 데이터프레임 컬럼을 확인                                                               
df.values  # 데이터프레임 값을 확인

df['voc_trt_perd_itg_cd'].value_counts()  # voc_trt_perd_itg_cd 컬럼 데이터별 건수를 나열         
df['voc_trt_perd_itg_cd'].value_counts(normalize = True)

#  voc_trt_perd_itg_cd 컬럼 데이터별 건수 비율 보기

 

불필요한 부분을 제거하자

df1 = df.drop(columns=['voc_trt_perd_itg_cd', 'voc_trt_reslt_itg_cd', 'oos_cause_type_itg_cd', 'engt_cperd_type_itg_cd',
                                      'engt_tgt_div_itg_cd', 'fclt_oos_yn'], axis=1)

# 불필요한 컬럼 삭제
# DataFrame drop() 함수 사용
# 컬럼 삭제한 결과를 "df1" 데이터프레임에 저장한다.
# 다중 컬럼 삭제

df1.drop(columns = ['voc_mis_pbls_yn'], inplace = True) # 단일 컬럼 삭제

df.drop(columns = ['new_date','opn_nfl_chg_date', 'cont_fns_pam_date'], inplace =True)

# 다중 컬럼 삭제

 

데이터 결측치를 처리하자 - 최빈값으로 대체하자

df1.replace('_', np.nan, inplace = True) # 모든 컬럼에 대하여 '_' 값을 null로 변경한다.
df1.isnull().sum() # 변경이 잘 되었는지 확인한다.

최빈값이 L로 확인된다.

df1['cust_class_itg_cd'].value_counts()  # 최빈값을 찾자
df1['cust_class_itg_cd'].fillna('L', inplace = True)  # 최빈값 'L'로 결측치를 대체하자
df1['cust_class_itg_cd'].isnull().sum()  # 잘 대체되었는지 Null 값을 확인하자
df1.info()

 

데이터 결측치를 처리하자 - 중앙값으로 대체하자

df1['age_itg_cd'].median() # 중앙값을 확인하자

df1['age_itg_cd'].replace(np.nan, 위에서 계산한 중앙값, inplace = True)

# 위에서 나온 중앙값으로 Null 값을 대체하자.

df1['age_itg_cd'].dtypes # 데이터 타입을 확인하자

df1['age_itg_cd'] = df1['age_itg_cd'].astype(int) # 값을 정수형으로 변환하자

df1['age_itg_cd'].isnull().sum() # Null 값 개수를 확인하자

df1.info() # age_itg_cd가 "int32" 타입인지 확인하자

내용

  • 먼저 필요 라이브러리들을 불러오자
  • 디렉토리에 학습할 파일이 잘 위치하고 있는지 확인하자
  • 데이터를 필요한 형태로 가공하자
  • 데이터의 정보를 파악하자
  • 타겟 데이터에 대해 파악하자
  • 데이터를 시각화하여 분석하자
  • Random Forest 알고리즘을 사용하여 모델링을 실시하자
  • 먼저, 데이터를 학습용과 평가용으로 나누자
  • 모델을 선언, 학습, 예측을 수행하자
  • 성능을 평가하자

먼저 필요 라이브러리들을 불러오자

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
 
from sklearn.ensemble import RandomForestClassifier # Random Forest 불러오기
from skelarn.model_selection import train_test_split # 데이터를 나누기 위해 불러온다
from sklearn.metrics import * # 모델 성능 평가를 위해 불러온다.

 

디렉토리에 학습할 파일이 잘 위치하고 있는지 확인하자

import os
os.getcwd() # 현재 디렉토리 위치 확인
os.listdir() # 현재 디렉토리의 폴더와 파일 출력
os.listdir('./data') # 특정 폴더 열어보기

 

데이터를 읽고, 필요한 형태로 가공하자

data = pd.read_csv('./data/train_data.csv') # data 변수에 train_data.csv 파일을 불러와서 할당한다.
data.drop('subject', axis =1, inplace = True ) # 불필요한 열을 제거하자

 

데이터의 정보를 파악하자

data.shape() # data 데이터프레임의 행, 열 개수
data.head(5) # 상위 5개 행을 확인
data.tail(3) # 하위 3개 행을 확인
data.columns # 데이터프레임의 컬럼명 확인
data.info() # 데이터프레임의 기초 정보(컬럼명, 데이터 개수, 데이터 타입) 확인
data.info(verbose = True, null_couns = True)
# verbose = True로 하면 모든 열에 대한 정보를 출력, null_counts = True를 하면 각 열에서 null 값의 수를 출력
data.describe() # 데이터프레임의 수치형 데이터 기초통계 정보 확인

 

타겟 데이터에 대해 파악하자

data['Activity].values # 고유값(범주) 확인
data['Activity].value_counts() # 고유값 별 개수 확인
data['Activity'].value_counts() / data['Activity'].value_counts().sum() # 고유값 비율 = 개별 범주의 수 / 전체 범주의 수
 
sns.countplot( data=data, x = 'Activity') # seaborn의 countplot을 통해 타겟 데이터를 시각화하여 분석하자
plt.xticks(rotation=90)
plt.grid()
plt.show()

countplot을 통해 범주별 개수를 시각화하였다.

먼저, 데이터를 학습용과 평가용으로 나누자

y = data['Activity']
x = data.drop('Activity', axis = 1) # target으로 사용할 Activity 컬럼을 제거하자
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size = 0.3, random_state = 2023)


 

모델을 선언, 학습, 예측을 수행하자

rf_model = RandomForestClassifier(random_state=2023) # 모델을 선언한다.
rf_model.fit(x_train, y_train) # 모델을 학습한다.
rf_pred = rf_model.predict(x_val) # 예측을 수행한다.

 

성능을 평가하자

print('accuracy_score', accuracy_score(y_val, rf_pred))
print('\nconfusion_matrix: \n', confusion_matrix(y_val, rf_pred))
print('\nclassification_report: \n', classification_report(y_val, rf_pred))

세 가지 예측을 수행하면 이러한 결과를 확인할 수 있다.

+ Recent posts