https://beaver-sohyun.tistory.com/52?category=864438
[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(2. 전체 feature 수집 및 특정 feature 추출)
이번 포스팅은 저번 시간에 수집한 데이터들을 가지고 decision tree를 이용한 데이터 분석입니다.
수집한 데이터에서 분석에 유용하게 쓰일만한 특정 feature를 추출한 후 데이터 분석을 진행했습니다.
6. 분석 방법
6-1-1. 패키지 및 데이터 로드
첫 번째로 분석에 사용될 패키지를 로드하였습니다.
- 또 각 프로젝트의 상세 URL을 통해 수집한 feature 데이터를 로드했습니다.
#패키지 로드
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from IPython.core.display import Image
from sklearn.tree import export_graphviz
from sklearn import tree
from sklearn import metrics
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import graphviz
import pydot
import io
수집한 모든 featurer 가운데 특정 feature 추출
#수집한 모든 feature 불러오기
success_feature= pd.read_csv('./success_link_feature.csv',index_col=0)
fail_feature = pd.read_csv('./fail_link_feature.csv',index_col=0)
success_feature
#성공, 실패한 Feature들을 concat으로 붙이기
#성공(120개), 실패(117개), 총 237개의 데이터 수집
df = pd.concat([success_feature, fail_feature],ignore_index=True)
# 모든 Feature 중에서 수치화 할 수 있는 Feature 추출하기
df = df[['backers','Number of projects opened','Total number of support steps','Maximum amount of sponsors','Minimum amount of sponsors','label']]
6-1-2. 속성과 클래스 분리
두 번째로는 속성과 클래스를 분리했습니다.
- DF_label로 프로젝트의 성공 여부 라벨을 변수에 넣고, 수집된 feature들 중 선별한 5개 feature를 DF 변수에 넣었습니다.
# df_label에는 label(성공, 실패)값을, df에는 나머지 수치화 값들을 넣어준다
df_label= df[['label']]
df = df[['backers','Number of projects opened','Total number of support steps'
,'Maximum amount of sponsors','Minimum amount of sponsors']]
# 분석에 사용하기 위해서 데이터의 형태를 바꿔주는 작업을 진행
# 데이터의 수치 값들을 float형으로 변환시킨 후, int형으로 변환시킨다.
df_label['label'] = df_label['label'].astype(str)
df=df.replace(',','',regex=True).astype(float)
df = df.astype(int)
df
후에 Decision tree에 해당 변수들을 넣기위해 변수 이름 다시 정의해서 값 넣기
# 데이터들을 쉽게 확인하기 위해 데이터 정리
df.feature_names = df.columns
df.target_names = np.array(['fail', 'success'])
df.data = df.values
df.target = df_label.label
#학습과 테스트 데이터 세트로 분리
# trian data 189개, test data 48개
x_train, x_test, y_train,y_test = train_test_split(df,df_label,train_size = 0.8)
x_train
6-1-3. 데이터 학습
세 번째로 데이터를 학습시켰습니다.
- 로드된 의사결정 트리 분류 모듈을 변수 clf에 저장했습니다.
- 오버피팅을 방지하기 위해 깊이는 5로 설정했습니다.
- clf의 함수 fit 함수에 변수 x_train, y_train을 입력해 의사결정 트리 분류 모델을 생성, 학습시켰습니다.
# DecicionTreeClassifier 생성(max_depth = 5 으로 제한) - 오버피팅 방지
clf=tree.DecisionTreeClassifier(max_depth=5,criterion='entropy',random_state=0)
# DecisionTreeClassifier 학습
clf.fit(x_train,y_train)
6-1-4. Decision tree 그래프 표현 및 Feature importance 시각화
네 번째로 의사결정 트리와 feature importance를 시각화시켰습니다.
- Tree 패키지 중 의사결정 트리를 dot 형식으로 내보내는 함수인 export_graphviz() 를 이용해 트리 표현을 함수로 만들었습니다.
# 트리를 결정하는데 각 Feature의 중요도를 확인하기 위해 Feature importance를 이용
def plot_feature_importances(model):
n_features=df.data.shape[1]
plt.barh(range(n_features),model.feature_importances_,align='center')
plt.yticks(np.arange(n_features),df.feature_names)
plt.xlabel('importance_value')
plt.ylabel('feature')
plt.ylim(-1,n_features
# 트리를 확인하기 위한 함수
def draw_decision_tree(model):
dot_buf = io.StringIO()
export_graphviz(clf, out_file=dot_buf, feature_names=df.feature_names,
class_names=df.target_names, filled=True,rounded=True)
graph = pydot.graph_from_dot_data(dot_buf.getvalue())[0]
image = graph.create_png()
return Image(image)
- feature_names는 각 features의 이름, class_names는 각 대상 class의 이름을 오름차순으로 정렬, filled는 True일 경우 분류를 위한 다수 클래스, 회귀 값의 극한 또는 다중 출력의 노드 순도를 나타내기 위해 노드를 색칠한다.
여기서는 함수에 대한 자세한 내용은 적지 않았습니다. 관심있으신 분들은 검색해보면서 실습해보시는거 추천드려요!!
참 분석이라는건 방대한 것 같아요.. 하면서 새로운 내용 발견하고,,, 하다가 또 다른 방법들도 보이고,, 다른 결과들도 나오고,,, 그만큼 많은 지식을 요하는 부분이라는 거겠죠..!!
다음시간에는 Decision tree를 이용해서 데이터 분석한 결과에 대해서 포스팅 하겠습니다.
오늘도 긴 글 읽어주셔서 감사드립니다.
행복한 하루 보내시길 바랄께요~
[빅데이터] kickstarter에서 Project에 큰 영향을 미치는 Feature 확인하기(4. Decision tree 결과 분석)
https://beaver-sohyun.tistory.com/55