데이터셋 확인하기
용어
- 레이블(Label), 타겟(Target)
- 결정값, 출력데이터, 종속변수
- 예측 대상이 되는 값. 지도학습시 학습을 위해 주어지는 정답 데이터
- 분류의 경우 레이블을 구성하는 고유값들을 클래스(class)라고 한다.
- 피쳐(Feature)
- 속성, 입력데이터, 독립변수
- Target이 왜 그런 값을 가지게 되었는지를 설명하는 변수.
- Target값을 예측하기 위해 학습해야 하는 값들.
scikit-learn 내장 데이터셋 가져오기
- scikit-learn은 머신러닝 모델을 테스트 하기위한 데이터셋을 제공한다.
- 이런 데이터셋을 Toy dataset이라고 한다.
- 패키지 : sklearn.datasets
- 함수 : load_xxxx()
from sklearn.datasets import load_iris
iris = load_iris()
iris.keys()
scikit-learn 내장 데이터셋의 구성
- scikit-learn의 dataset은 딕셔너리 형태의 Bunch 클래스 객체이다.
- keys() 함수로 key값들을 조회
- 구성
- target_name: 예측하려는 값(class)을 가진 문자열 배열
- target: Label(출력데이터)
- data: Feature(입력변수)
- feature_names: 입력변수 각 항목의 이름
- DESCR: 데이터셋에 대한 설명
판다스 데이터프레임으로 구성
- 데이터 프레임 생성 후 데이터 확인
import pandas as pd
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['species'] = iris.target
iris_df
문제 정의
내가 발견한 Iris 꽃받침(Sepal)의 길이(length)와 폭(width)이 각각 5cm, 3.5cm이고 꽃의 꽃잎(Petal)의 길이와 폭은 각각 1.4cm, 0.25cm이 이었다. 이 꽃는 Iris의 무슨 종일까?
결정 트리(Decision Tree) 알고리즘을 이용한 분류
개요
- 독립 변수의 조건에 따라 종속 변수를 분리
- 머신러닝의 몇안되는 White box 모델
- 결과에 대한 해석이 가능하다.
- 과적합(Overfitting)이 잘 일어나는 단점이 있다.
- 랜덤 포레스트(Random Forest), Gradient Boosting, Adaptive boosting과 같은 Boosting 계열 앙상블이 결정트리를 기반으로 하고 있다
결정트리 모델을 이용해 머신러닝 구현
- import 모델
- 모델 생성
- 모델 학습시키기
- 예측
from sklearn.tree import DecisionTreeClassifier
# 모델생성
dt = DecisionTreeClassifier()
# 학습시키기-tain, fit => 우리데이터셋이 모델을 맞추는 작업
dt.fit(iris.data, iris.target) #input, output
# 예측
pred = dt.predict(iris.data)
pred
#==> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
# 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
# 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
# 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
# 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
# 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
# 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
# 검증 - 정확도
from sklearn.metrics import accuracy_score
accuracy_score(iris.target, pred)
#정확도 (실제target, 예측결과) : 0 ~ 1
머신러닝 프로세스
훈련데이터셋과 평가(테스트)데이터 분할
- 위의 예는 우리가 만든 모델이 성능이 좋은 모델인지 나쁜 모델인지 알 수 없다.
- 전체 데이터 셋을 두개의 데이터셋으로 나눠 하나는 모델을 훈련할 때 사용하고 다른 하나는 그 모델을 평가할 때 사용한다.
- 보통 훈련데이터와 테스트데이터의 비율은 8:2 또는 7:3 정도로 나누는데 데이터셋이 충분하다면 6:4까지도 나눈다.
데이터셋 분할시 주의
- 각 클래스(분류대상)가 같은 비율로 나뉘어야 한다.
scikit-learn의 train_test_split() 함수 이용 iris 데이터셋 분할
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = \
train_test_split(iris.data,#input data(feature)
iris.target, #output data(label)
test_size=0.2, #테스트 셋의 비율(전체중 20%, 기본:0.25)
stratify = iris.target, #각 class들을 같은 비율로 나눈다.
random_state=1 #random 시드값
)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
#==> ((120, 4), (30, 4), (120,), (30,))
type(X_train), type(y_train)
#==> (numpy.ndarray, numpy.ndarray)
모델생성 및 학습
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(X_train, y_train)
평가
- 머신러닝 평가지표 함수들은 sklearn.metrics 모듈에 있다.
- accuracy(정확도)
- 전체 데이터셋중 맞춘 개수의 비율
from sklearn.metrics import accuracy_score # 훈련데이터셋으로 예측 pred_train = dt.predict(X_train) # 테스트 데이터셋으로 예측 pred_test = dt.predict(X_test)
- 전체 데이터셋중 맞춘 개수의 비율
acc_train = accuracy_score(pred_train, y_train)
acc_test = accuracy_score(pred_test, y_test)
print(f"훈련데이터셋 정확도: {acc_train}, 테스트데이터셋 정확도:{acc_test}")
#==> 훈련데이터셋 정확도: 1.0, 테스스데이터셋 정확도:0.9666666666666667
- 혼동행렬 (Confusion Matrix)
- 예측 한 것이 실제 무엇이었는지를 표로 구성한 평가 지표
- 분류의 평가 지표로 사용된다.
- axis=0: 실제, axis=1: 예측
from sklearn.metrics import confusion_matrix
cm_train = confusion_matrix(y_train, pred_train) #실제값, 예측값
cm_test = confusion_matrix(y_test, pred_test)
```
cm_train
==> array([[40, 0, 0],
[ 0, 40, 0],
[ 0, 0, 40]], dtype=int64)
cm_test
==> array([[10, 0, 0],
[ 0, 10, 0],
[ 0, 1, 9]], dtype=int64)
728x90
반응형
'Data Analysis & ML > Machine Learning' 카테고리의 다른 글
[Machine Learning][머신러닝] 과적합과 해결방법(그리드서치/파이프라인) (0) | 2020.08.31 |
---|---|
[Machine Learning][머신러닝] Classification(분류) 평가지표 (0) | 2020.08.28 |
[Machine Learning][머신러닝] 데이터 전처리(범주형/연속형) (5) | 2020.08.27 |
[Machine Learning][머신러닝] 데이터셋 나누기와 교차검증 (0) | 2020.08.26 |
[Machine Learning][머신러닝] 머신러닝 개요 (0) | 2020.08.26 |