본문 바로가기
개발일지/임시카테고리

machine learning 루틴 2 iris 꽃 외, 리스트, 튜플, dict 전환(순환)원리

by 다니엘의 개발 이야기 2022. 7. 11.
320x100
# 내가 훈련시킨 것으로 좀 더 구체적인 측정을 해보고 싶다면

iris_tree.predict_proba(test_data)
# array([[0.        , 0.97222222, 0.02777778]])​
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

import pandas as pd

iris = load_iris()
features = iris.data[:,2:]
labels = iris.target

 

# 훈련용 80%, 테스트용 20%를 사용했다는 의미
x_train, x_test, y_train, y_test = train_test_split(feature, labels, test_size=0.2, random_state=13)

 

x_train.shape, x_test.shape

# ((120, 2), (30, 2))

 

import numpy as np

# 각각의 y_test가 몇개씩 있는지 확인
np.unique(y_test, return_counts=True)

#(array([0, 1, 2]), array([ 9,  8, 13]))

# 일반적으로는 밸런스를 맞춰주는것이 기본이다.
# 그래서 위에서 training과 test를 구분해줄때 이를 원한다면 stratify = 해당하는 값 을 입력해준다.
# stratify = labels 가 입력될 경우
# array의 출력값은 10,10,10 으로 나오게 된다.

 

# 모델 설정해주기

from sklearn.tree import DecisionTreeClassifier

# max_depth는 최대치의 가지 단계다. 이 단계가 많아 질수록 더욱 정교하게 학습이 가능하다.
# 2라고 한건 2단계 가지치기이기때문에 깊이가 매우 얕다.

# 하지만 max_depth가 낮으면 과적합을 막을 수 있다고 한다.
iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(x_train, y_train)

 

# 설정된 모델 확인

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

plt.figure(figsize=(12,8))
plot_tree(iris_tree);

 

from sklearn.metrics import accuracy_score

y_pred_tr = iris_tree.predict(iris.data[:,2:])
accuracy_score(iris.target, y_pred_tr)
# 0.96

 

y_pred_test = iris_tree.predict(x_test)

# train data보다 test data의 accuracy가 좋아지는 경우는 흔치 않음
# 바로 위에서 y_pred_test에 정의된 x_test의 예측치와 y_test를 비교해줘.
accuracy_score(y_test, y_pred_test)
# 0.9666666666666667

 

from mlxtend.plotting import plot_decision_regions

# train data와 test data를 분리시켜서 강조를 하고, 결정경계까지 넣어보려는 준비
# 사이즈 150, 라벨은 test data, 투명도는 0.9라는 의미
scatter_highlight_kwargs = {'s': 150, 'label' : 'Test data', 'alpha' : 0.9}

# edgecolor는 넣지 마라
scatter_kwargs = {'s':120, 'edgecolor': None, 'alpha':0.9}

plt.figure(figsize=(12,8))
# plot_decision_regions의 처음 파라미터 X는 대문자로 써줘야한다.
plot_decision_regions(X=features, y=labels,
                        # X_highlight도 주의해야한다. 대문자다.
                        X_highlight = x_test, clf = iris_tree, legend=2,
                        scatter_highlight_kwargs = scatter_highlight_kwargs,
                        scatter_kwargs = scatter_kwargs,
                        contourf_kwargs = {'alpha': 0.2}
                        )

 

# 슬라이싱을 안해준다는 의미는 이젠 iris안의 data를 모두 가져와서 쓰겠다는 의미다.
features = iris.data
labels = iris.target

X_train, X_test, y_train, y_test = train_test_split(features, labels,
                                                    test_size = 0.2,
                                                    stratify = labels,
                                                    random_state = 13)

iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(X_train, y_train)

 

plt.figure(figsize=(12,8))
plot_tree(iris_tree);

 

# test_data가 왜 이중 리스트로 쌓여있냐면
test1 = np.array([[4.3,2.,1.2,1.]])
print(test1.shape)
# (1, 4)

test2 = np.array([4.3,2.,1.2,1.])
print(test2.shape)
# (4,)

# 와 같이, test1은 행, 렬이 존재하고,
# test2는 행만 존재한다.

# 행렬의 계산이 서로 맞아떨어져야 연산이 가능하다.
# 따라서 이중리스트로 만들어준것이다.

test_data = [[4.3,2.,1.2,1.]]

# iris_tree의 정보를 토대로 예측을 해줘. test_data는 종류가 뭐야?
iris_tree.predict(test_data)

# array([1])

 

# 내가 측정하고자 하는 값이 숫자가 아닌, name값으로 출력되길 원한다면
iris.target_names[iris_tree.predict(test_data)]

# array(['versicolor'], dtype='<U10')

 

iris_tree = DecisionTreeClassifier(max_depth=5, random_state=13)
iris_tree.fit(X_train, y_train)

iris_tree.feature_importances_

# array([0.        , 0.03389831, 0.39580123, 0.57030046])

 

# 중요도 확인
iris_clf_model = dict(zip(iris.feature_names, iris_tree.feature_importances_))
iris_clf_model

# {'sepal length (cm)': 0.0,
# 'sepal width (cm)': 0.033898305084745756,
#  'petal length (cm)': 0.3958012326656394,
# 'petal width (cm)': 0.5703004622496148}

 



# 부수 강의

# 서로 각각 다른 리스트의 원소를 각각 튜플로 만들어 주는 기능이 zip

list1 = ['a', 'b', 'c']
list2 = [1,2,3]

pairs = [pair for pair in zip(list1, list2)]
pairs

# [('a', 1), ('b', 2), ('c', 3)]

 

 

# 튜플을 dict(사전)으로 전환
dict(pairs)

# {'a': 1, 'b': 2, 'c': 3}

 

# unpacking

x, y = zip(*pairs)

 

x

# ('a', 'b', 'c')

 

y

# (1, 2, 3)
300x250