머신러닝
머신러닝 - ex04_mushroom데이터활용_tree분류실습
인생진리
2023. 2. 14. 17:10
### 문제정의
- 버섯의 특징을 활용해 독/식용 분류
- 특성선택(특성중요도)확인하기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
pd.set_option('display.max_columns',None)
### 데이터 수집
# 데이터 불러오기
data = pd.read_csv('./mushroom.csv')
data.head()
data.shape
### 데이터 전처리
# 정보를 확인하는 함수
# 결측치(null)여부 확인
# 데이터 타입 문자형식 -> 전처리 필요
data.info()
# 문제(특성)와 답 분리
X = data.iloc[:,1:]
# X = data.loc[:,'cap-shape':]
y = data['poisonous']
display(X)
display(y)
### 탐색적 데이터 분석(EDA)
# 기술통계
# cont : 총 데이터 수
# unique : 중복없이 나오는 고유한 데이터 값
# top : 가장 값이 많은 데이터(최빈값인 항목)
# freq : 최빈 데이터의 실제 수 (top의 개수, 최빈값)
X.describe()
X['cap-shape'].value_counts()
y.value_counts()
#### 전처리 - 인코딩
- 범주형 -> 수치형(숫자모양)
# 특성 데이터에 대해서 인코딩
# 답 데이터 인코딩 필요 X
X_one_hot = pd.get_dummies(X)
X_one_hot
X['habitat'].unique()
# 딕셔너리로 숫자량 맵핑
dict_HAB = {
'u' : 2,
'g' : 1,
'm' : 3,
'd' : 5,
'p' : 4,
'w' : 6,
'l' : 7
}
# 실제 데이터 반영 map()
# X['habitat'].map(dict_hab)
#### 훈련, 평가 셋 분리
- train_test_split(랜덤샘플링) : 1. 랜덤하게 섞고 2. 나누기
- 비율 7 : 3
- random_state : 랜덤하게 섞이는 규칙, 고정 값
X_train, X_test, y_train, y_test = train_test_split(X_one_hot, y, test_size = 0.3,
random_state = 7)
print('훈련용 문제 : ',X_train.shape)
print('훈련용 답 : ',y_train.shape)
print('평가용 문제 : ',X_test.shape)
print('평가용 답 : ',y_test.shape)
### 모델 선택 및 학습
# 모델링
# 객체 생성
tree_model = DecisionTreeClassifier()
# 과대적합을 제어 X - default
DecisionTreeClassifier?
#학습,fit
tree_model.fit(X_train, y_train)
# 예측, predict
pre = tree_model.predict(X_test)
# 정확도 확인, accuracy_score
from sklearn.metrics import accuracy_score
accuracy_score(pre, y_test)
### 교차검증(여러번 검증)
- 개념 : 일반화 성능 측정 방법 -> 모든 데이터에 대해 모델이 얼마나 잘 맞추는지 확인,한번 평가하는거 보다 안정적
- 방법 : 훈련세트와 평가세트(검증용) 여러겹 나눠서 평가
- 모델 객체 정의하고 난 후에 (학습 전) 정확도가 어느정도일지 확인
from sklearn.model_selection import cross_val_score
result = cross_val_score(tree_model, X_train, y_train, cv=5)
print('교차검증 결과 : ',result)
print('교차검증 정확도 평균 : ',result.mean())
### 특성별 중요도 확인
importance_values = tree_model.feature_importances_
importance_values
im_df = pd.DataFrame(importance_values,index = X_one_hot.columns, columns= ['importance'])
im_df_top = im_df.sort_values(by ='importance', ascending= False)
im_df_top
import seaborn
# 시각화 라이브러리 seaborn
import seaborn as sns
import matplotlib.pyplot as plt
# 정렬과 시각화를 쉽게 하기 위해 series 전환
im_series = pd.Series(importance_values, index=X_one_hot.columns)
im_top20 = im_series.sort_values(ascending=False)[:20]
#특성 중요도 시각화
plt.figure(figsize = (15,10))
plt.title('Feature Importance Top 20')
sns.barplot(x= im_top20, y=im_top20.index)
해당 코드는 버섯의 독/식용 분류 문제를 트리 기반 모델을 사용하여 해결하는 코드이다.
코드에서 데이터를 전처리하고 탐색하고,
모델을 학습시키며, 교차검증을 수행하며,
마지막으로 특성별 중요도를 시각화하는 과정을 거친다.
특히, DecisionTreeClassifier 모델을 사용하여 학습을 수행하고,
특성별 중요도를 seaborn 라이브러리를 활용하여 시각화한다.