머신러닝 레시피 #2

3905 단어 기계 학습
기계 학습 레시피 #1에서 분류기로 결정목을 사용한다.이번에는 그 가시화를 어떻게 처리할 것인가.
분류기는 몇 가지 유형이 있다.
- ANN(artificial neural network)
- SVM(Support Vector Machine)
지난번에 결정목을 사용한 이유는 분류기가 왜 결정(이해하기 쉬운) 모델 중 하나를 정확하게 이해할 수 있기 때문이다.

이번에 사용한 데이터 세트 - 코일 -


https://en.wikipedia.org/wiki/Iris_flower_data_set
코일은 꽃잎의 길이와 너비 등 각종 측정치에 따라 꽃의 종류를 정할 수 있다.
데이터 세트에는 세 종류의 다른 꽃이 포함되어 있다.모두 150건(50건x3)을 준비했다.
각 예에서 4개의 특징량(꽃받침과 꽃잎의 길이와 너비)을 사용했다.
Sepal length
Sepal width
Petal length
Petal width
Species
5.1
3.5
1.4
0.2
I. setosa
4.9
3.0
1.4
0.2
I. setosa
7.0
3.2
4.7
1.4
I. versicolor
목표는
- 이 데이터 세트 사용
- 학습 분류기
- 그리고 그 분류기로 새 꽃을 주면 어떤 종류의 꽃인지 예측해
- Tree 정보를 시각적으로 표시

1. 데이터 가져오기


아이리스 데이터 집합을 가져옵니다.데이터(꽃의 이름)와 메타데이터(특징량)가 모두 포함되어 있다.
>>> from sklearn.datasets import load_iris
>>> iris = load_iris()
>>> print iris.feature_names
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
>>> print iris.target_names
['setosa' 'versicolor' 'virginica']

dta変数には特徴量が入っている。
>>> print iris.data[0]
[ 5.1  3.5  1.4  0.2]

target変数にはラベルが入っている。
>>> print iris.target[0]
0 ※0なのでsetosaを表す
잠시 후 일부 샘플 데이터에 대해 분류기 테스트를 실시하여 그 정확성을 측정할 것이다.이 데이터는 테스트 데이터라고 불린다.프로그래밍과 마찬가지로 테스트는 매우 중요하다.
그러나 이번에는 세 가지 예(각종 꽃의 한 가지 예)만 테스트 데이터로 제외했다.
대부분의 데이터는 학습에 쓰인다.
# training data
train_target = np.delete(iris.target,test_idx)
train_data = np.delete(iris.data, test_idx, axis=0)

# testing data
test_target = iris.target[test_idx]
test_data = iris.data[test_idx]

2. 분류기를 배우게 한다


결정 나무 분류기를 만들어 학습 데이터를 배우다.
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf.fit(train_data, train_target)

3. 새 꽃 예측

分類器が予測するもの
>>> print test_target
[0 1 2]

分類器を使って予測したテストデータの結果は上記と同じになっている。
>>>print clf.predict(test_data)
[0 1 2]

4. 나무를 시각화하고 분류기의 작업 방식을 관찰한다

pip install pydotplus
pip install graphviz
pip install --upgrade IPython
from sklearn.externals.six import StringIO
import pydotplus
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data,
                     feature_names=iris.feature_names,
                     class_names=iris.target_names,
                     filled=True, rounded=True,
                     impurity=False)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("iris.pdf")
open -a preview iris.pdf

각 노드는 피쳐 양 중 하나에 대해 예 또는 아니오를 묻습니다.예를 들어 맨 위의 노드에서 꽃잎의 폭이 0.8cm 이하인지 물어본다.답이 사실이라면 왼쪽으로, 가짜라면 오른쪽으로 가세요.
>>> print iris.feature_names, iris.target_names
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] ['setosa' 'versicolor' 'virginica']

>>> print test_data[1], test_target[1]
[ 7.   3.2  4.7  1.4] 1
4
  • pental width가 1.4대 0.8이기 때문에False.오른쪽으로.
    4
  • pental width가 1.75 이하인지 1.4가 작기 때문에 True.왼쪽으로 가세요.
    4.95 이하의 페탈렌츠에 대해 물었더니 4.7이 작아서 트루.왼쪽으로 가세요.
    4
  • pental width가 1.65 이하이고 1.4가 작기 때문에 True라는 질문을 받았다.
    - 그 결과 versic로 예측됐다
  • 좋은 웹페이지 즐겨찾기