본문 바로가기
IT,SW,Data,Cloud,코딩

파이썬 공부4

by 착실하게 2022. 9. 19.
반응형

머신러닝 분류 기법
1. 의사결정나무
2. 군집 분석

===========================================
1. 의사결정나무
===========================================

특징
- 입력데이터가 까다롭지 않음
- 직관적임
- 나무 그리는패키지 설치 필요함. graphviz 다운로드 하기.
- pydot 설치
- pydotplus 설치
- graphviz 설치 및 시스템 환경변수 편집 ( Graphviz2.38 위치를 환경변수 path에 추가. )


import os

os.environ["PATH"]+=os.pathsep + 'c:/Program Files (x86)/Graphviz2.38/bin/'

트리로 학습하는 코드

from sklearn import tree

X = X_train
y = y_train

dTree = tree.DecisionTreeClassifier()
dTreeModel = dTree.fit(X,y)
print( dTreeModel )



DecisionTreeClassifier( ccp_alpha = 0.0 , class_weight = None , criterion = 'gini' , max_depth = None , max_features = None , max_leaf_nodes = None , min_impurity_decrease = 0.0 , min_impurity_split = None , min_samples_leaf = 1, min_samples_split = 2 , min_weight_fraction_leaf = 0.0 , presort = 'deprecated' , random_state = None, splitter = 'best' )




from sklearn.tree import export_graphviz

import pydotplus

from IPython.display import Image

dot_data = export_praphviz( dTreeModel, out_file = None , feature_names = ['cum_precipitation', 'humidity', 'temp', 'wind'], class_names = ('Y', 'N'), filled = True , rounded = True , special_characters = True )
graph = pydotplus.graph_from_dot_data(dot_data)

Image( graph.create_png() )


불순도 gini
항상 불순도가 낮아지도록 분기하는게 의사결정나무 만드는 규칙임

의사결정나무 결과의 해석
나타나는 값은 4가지
- gini 불순도
- samples 데이터 갯수
- value = [ 20, 28 ] y 20개 n 28 개
- class = N 이면 ; 다수결로 현재로는 클래스가 N 라는 뜻


의사결정나무는
매 노드에서 불순도를 낮출 수 있는 가장 중요한 feature 와 기준값을 찾는다.
불순도가 0이 되거나,
미리 설정한 멈춤 기준에 해당하면 나무 생성을 중단한다.
리프 노드에 해당하는 분류 결과가 나온다.




dTreeModel.predict( X_test )
예측 결과를 얻는 코드




정확도 비교 코드
from sklearn.metrics import accuracy_score

y_pred = dTreeModel.predict( X_test )

print( 'Accuracy : %.2f' %accuracy_score( y_test, y_pred ) )


정확도를 알수있다.

좀더 다양한 관점에서 정확도를 보려면,

y_pred = dTreeModel.predict( X_test )

print( classification_report( y_test , y_pred ))


precision, recall, f1-score 값 확인 가능함.



여러 가지 기법으로 작업해 보고, 더 우수한 결과를 보이는 기법을 선택하면 된다.

의사결정나무는 과적합 우려가 있다. 학습 정확도는 훌륭한데 예측 정확도는 낮을 수 있다. 그리고 최적 모델 찾아주는건 아니다.

===========================================
지도 학습과 비지도 학습
===========================================

지도 학습

데이터 안에 정답이 있어서 (=종속변수)
입력값과 정답을 비교하면서
수식을 찾거나 확률을 찾는 방식으로
수치값을 예측하거나, 범주를 예측.

종속변수의 관측값, 이력데이터가 있어서
독립변수와의 관계를 찾아볼 수 있다.

비지도 학습

군집 분석 등.


===========================================
군집 분석: K-means Clustering
===========================================

비지도학습:
답이 존재하지 않는 데이터!

K-means Clustering
고객 세분화, 상권 세분화 등에 사용된다.

유사함의 정의가 필요.
어떤 값을 기준으로 비슷하다고 할지 feature 값을 정하는게 중요함
몇 개의 그룹으로 나눠야 하는지 값을 정해줘야한다.

유사함의 정의로 자주 사용되는 것은 거리.
- 물리적 거리
- 추상적 거리


수치형 데이터로 표현할 수 있는 항목으로 거리 계산 가능함.

Normalization
특정 데이터 항목이 편차, 단위 차이가 너무 크면 , 이 항목이 가장 중요한 기준으로 선택되어버린다.

예를 들어, 동물들의 키 차이는 동물들의 뇌의 무게 차이보다 단위가 더커서, 동물들 비교할 때 더 눈에 띄는 차이로 보여진다.
그런데, 뇌의 무게 차이가 키 차이보다 더 중요하고 직접적인 원인일 수도 있다.

그래서 표준화처리 필요함
패키지 sklearn의 processing 모듈 사용.

from sklearn.processing import MinMaxScaler

import pandas as pd

import numpy as np


MinMaxScaler 사용 실습


weather = pd.read_csv( 'data/weather.csv' )

X = np.array( weather.humidity ).reshape( -1 , 1 )

scaler = MinMaxScaler()

X_scaled = scaler.fit_transform( X )

print( X_scaled )


MinMaxScaler는 humidity 의 최대값을 1로 두고, 최소값은 0으로 두고
나머지는 0에서 1사이의 상대적인 비율로 변환한다.
그래서 절대값 경중의 문제를 극복할 수 있다.



지역, 일, 시간대 별 횟수 집계 하는 코드

n_data = pd.pivot_table( data , index = [ 'Region' , 'Date' , 'Time' ] , values = 'Distance' , aggfunc = len )

n_data = data.reset_index()

n_data.rename( columns = { 'Distance' : 'Count' } , inplace = True )

print( n_data )

이렇게 만든 데이터를 다시 처리

n_data2 = pd.pivot_table( n_data , index = 'Region' , columns = 'Time_out' , values = 'Count' , aggfunc = np.mean )

n_data2 = n_data2.reset_index()

print( n_data2 )


이 실습에서 이 결과로 만들어진 데이터는
행: 지역별
열: 시간대별
값: 평균 대여건수

이 데이터를 K-means 로 분류하는 파이썬 코드

from sklearn import cluster

X = n_data2.iloc[ 0:5 , 1:25 ]

y = n_data2.Region

km2 = cluster.KMeans( n_clusters = 2 ).fit( X )

km3 = cluster.KMeans( n_clusters = 3 ).fit( X )

km4 = cluster.KMeans( n_clusters = 4 ).fit( X )


비교해보기위해 클러스터된 결과를 합쳐서 보는 코드


n_data2[ '2_Cluster' ] = km2.labels_

n_data2[ '3_Cluster' ] = km3.labels_

n_data2[ '4_Cluster' ] = km4.labels_

n_data2[['Region','2_Cluster','3_Cluster','4_Cluster']]

이렇게 해서 확인 하면 된다.

K-means Clustering은
K 값을 주면 K 개의 클러스터를 만들어 준다.

그런데 적절한 클러스터의 갯수 결정은 어떻게?












반응형

댓글