from sklearn.datasets import load_iris
iris = load_iris()
iris.keys()
iris.target_names
iris.target
iris.data


import pandas as pd
iris_pd = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_pd

iris_pd['species'] = iris.target
iris_pd.head()

plt.figure(figsize=(12, 6))
sns.boxplot(x='sepal length (cm)', y='species', data=iris_pd, orient='h')

sns.pairplot(iris_pd, hue='species')
sns.pairplot(iris_pd,
vars=['petal width (cm)', 'petal length (cm)'],
hue='species', height=4)


plt.figure(figsize=(12, 6))
sns.scatterplot(x='petal width (cm)', y='petal length (cm)',
data=iris_pd, hue='species', palette='Set2')

iris_12 = iris_pd[iris_pd['species'] != 0]
plt.figure(figsize=(12, 6))
sns.scatterplot(x='petal width (cm)', y='petal length (cm)',
data=iris_12, hue='species', palette='Set2')

from sklearn.tree import DecisionTreeClassifier
iris_tree = DecisionTreeClassifier()
iris_tree.fit(iris.data[:, 2:], iris.target)
# iris.data[:, 2:] : 모든 열은 제공하고 컬럼은 2, 3인 petal width (cm), petal length (cm)만 제공
# .fit(학습용 데이터, 학습용 데이터에 맞는 값(=정답)) : 데이터를 제공할테니 학습시키기위한 명령어

from sklearn.tree import plot_tree
plt.figure(figsize=(8, 8))
plot_tree(iris_tree)




from sklearn.metrics import accuracy_score
y_pred_tr = iris_tree.predict(iris.data[:, 2:])
# .predict : 데이터를 줄테니 .fit을 통해 학습한데로 예측을 해봐라
y_pred_tr
accuracy_score(iris.target, y_pred_tr)
# accuracy_score(정답데이터, 예측데이터) : 정답데이터와 예측데이터를 비교하여 정확도를 계산해달라는 명령어

from mlxtend.plotting import plot_decision_regions
plt.figure(figsize=(8, 8))
plot_decision_regions(X=iris.data[:, 2:], y=iris.target, clf=iris_tree, legend=2)
# clf : classifier(=분류기), 여기선 iris를 구분하기 위해 학습한 iris_tree
plt.show


from sklearn.model_selection import train_test_split
features = iris.data[:, 2:]
labels = iris.target
# 8:2 확률로 특성(features)과 정답(labels)을 분리
X_train, X_test, y_train, y_test = train_test_split(features, labels,
test_size=0.2,
# test_size= : 분리 기준 설정
# train : 80%, test : 20% 로 데이터 분리
stratify=labels,
# stratify= : 나눈 데이터에 labels 수를 동일한 비율로 맞춰주는 설정
random_state=13)
y_train.shape, y_test.shape

import numpy as np
# 위에서 120, 30 개로 나눈 데이터에 3가지 속성의 값들이 동일한 비율로 들어가있는지 확인,
# 비율이 동일한 것이 좋은 데이터
np.unique(y_test, return_counts=True)

from sklearn.tree import DecisionTreeClassifier
iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(X_train, y_train)
# 이번엔 fit에 상기에서 분리한 데이터 입력
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(8, 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)

from mlxtend.plotting import plot_decision_regions
plt.figure(figsize=(8, 8))
plot_decision_regions(X=X_train, y=y_train, clf=iris_tree, legend=2)
# clf : classifier(=분류기), 여기선 iris를 구분하기 위해 학습한 iris_tree
plt.show

y_pred_test = iris_tree.predict(X_test)
# .predict : 데이터를 줄테니 .fit을 통해 학습한데로 예측을 해봐라
accuracy_score(y_test, y_pred_test)
# accuracy_score(정답데이터, 예측데이터) : 정답데이터와 예측데이터를 비교하여 정확도를 계산해달라는 명령어

features = iris.data
labels = iris.target
# 8:2 확률로 특성(features)과 정답(labels)을 분리
X_train, X_test, y_train, y_test = train_test_split(features, labels,
test_size=0.2, # test_size= : 분리 기준 설정
# train : 80%, test : 20% 로 데이터 분리
stratify=labels,
# stratify= : 나눈 데이터에 labels 수를 동일한 비율로 맞춰주는 설정
random_state=13)
iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(X_train, y_train)
plt.figure(figsize=(8, 8))
plot_tree(iris_tree)

test_data = np.array([[4.3, 2.0, 1.2, 1.0]])
iris_tree.predict(test_data)
iris_tree.predict_proba(test_data)
# predict_proba() : 예측된 값이 3가지 속성들 중 얼마나 비중을 차지하는지 보여주는 함수
iris.target_names[iris_tree.predict(test_data)]

iris_tree.feature_importances_
iris_clf_model = dict(zip(iris.feature_names, iris_tree.feature_importances_))
iris_clf_model

list1 = ['a', 'b', 'c']
list2 = [1, 2, 3]
pairs = [pair for pair in zip(list1, list2)]
pairs
dict(pairs)
dict(zip(list1, list2))

x, y = zip(*pairs)
x
list(x)
y
list(y)
