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
'개발일지 > 임시카테고리' 카테고리의 다른 글
pandas(판다스) 기초 2 (0) | 2022.07.14 |
---|---|
pandas 기초1 (0) | 2022.07.14 |
GIT fatal: bad config line 18 in file /users/daniel_choi/.gitconfig (0) | 2022.07.09 |
python 정규표현식 re로 문자열 안의 값을 꺼내기, 변경해주기 (0) | 2022.07.08 |
Python 기본용어 원리 (strip, split, join, upper, lower, capitalize) (0) | 2022.07.08 |