from sklearn.datasets import load_iris
iris_data = load_iris()
iris_data # Bunch 클래스 객체(딕셔너리와 유사함)
# iris_dataset의 키 값
iris_data.keys()
# DESCR 키에는 데이터셋에 대한 설명
print(iris_data['DESCR'])
# target_names : 예측하고자 하는 붓꽃 품종의 이름을 문자열 배열로 가지고 있음
iris_data['target_names']
# feature_names : 각 특성을 설명하는 문자열
iris_data['feature_names']
# 꽃잎의 길이, 폭, 꽃받침의 길이, 폭 -> 2차원 Numpy 배열의 형태
iris_data['data']
# target은 1차원 Numpy배열
# 0은 setosa, 1은 versocolor, 2는 virginica
iris_data['target']
from sklearn.model_selection import train_test_split
# 컬럼 이름 설정 (iris_data['feature_names'])
# iris_df라는 변수에 담아주기
iris_df = pd.DataFrame(iris_data['data'], columns = iris_data['feature_names'])
iris_df
X = iris_df.values
y = iris_data['target']
# train_test_split : 데이터를 나누기 전에 유사 난수 생성기를 사용해
# 데이터셋을 무작위로 섞어준다.
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.3,
random_state=65)
# random_state 매개변수 : 함수를 여러번 실행해도 결과가 똑같이 나오게 된다.
# 훈련용 세트 크기 확인
print(X_train.shape)
print(y_train.shape)
# 테스트 세트 크기 확인
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
knn = KNeighborsClassifier(n_neighbors=3)
# 모델명.fit(훈련용 문제, 훈련용 답)
knn.fit(X_train, y_train)
# 모델명.predict(테스트용 문제)
pre = knn.predict(X_test)
metrics.accuracy_score(pre, y_test)
test_list = []
train_list = []
for k in range(1, 105, 2):
# 모델생성
knn = KNeighborsClassifier(n_neighbors=k)
# 학습
knn.fit(X_train, y_train)
# test 데이터
# 예측
test_pre = knn.predict(X_test)
# 평가
test_score = metrics.accuracy_score(test_pre, y_test)
# test_list라는 리스트에 평가값을 담아주기
test_list.append(test_score)
# train 데이터
# 예측
train_pre = knn.predict(X_train)
# 평가
train_score = metrics.accuracy_score(train_pre, y_train)
# train_list라는 리스트에 평가값 담아주기
train_list.append(train_score)
test_list
train_list
plt.rcParams['font.family'] = 'Malgun Gothic'
plt.figure(figsize=(10,10))
plt.plot(range(1, 105, 2), train_list, label='train')
plt.plot(range(1, 105, 2), test_list, label='test')
plt.legend()
plt.xlabel("이웃의 수")
plt.ylabel("정확도")
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split # 훈련과 테스트용 셋트 분리
from sklearn.metrics import accuracy_score # 평가를 진행할 때 정확도 측정
from sklearn.tree import DecisionTreeClassifier # 결정트리모델 가져오기
data = pd.read_csv('mushroom.csv')
data
data.shape
data.info()
X= data.loc[:,'cap-shape':]
y = data.loc[:,'poisonous']
data.describe()
# e(edible) : 식용버섯
# p(poisonous) : 독버섯
y.value_counts()
X['habitat']
habitat_dic = {
'u':0,
'g':1,
'm':2,
'd':3,
'p':4,
'w':5,
'l':6
}
X['habitat'].map(habitat_dic)
X['habitat']=X['habitat'].map(habitat_dic)
X['habitat']
X_one_hot = pd.get_dummies(X)
X_one_hot.head()
print("원본 특성 : \n", list(X.columns), "\n")
print("원 핫 인코딩 이후 특성 : \n", list(X_one_hot.columns))
X_one_hot
# X_one_hot, y
# train_test_split 함수 사용
X_train, X_test, y_train, y_test = train_test_split(X_one_hot, y, test_size=0.3)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
tree = DecisionTreeClassifier(max_depth=3)
tree1 = DecisionTreeClassifier()
tree.fit(X_train, y_train)
tree1.fit(X_train, y_train)
pre = tree.predict(X_test)
y_test
print("예측 정확도 : {0: .4f}".format(accuracy_score(pre, y_test)))
!pip install graphviz
import os
os.environ["PATH"]+=os.pathsep+'C:/Program Files/Graphviz/bin/'
from sklearn.tree import export_graphviz
export_graphviz(tree, out_file='tree.dot',
class_names=['p','e'],
feature_names=X_one_hot.columns,
impurity=False,
filled=True)
from sklearn.tree import export_graphviz
export_graphviz(tree1, out_file='tree1.dot',
class_names=['p','e'],
feature_names=X_one_hot.columns,
impurity=False,
filled=True)
import graphviz
with open('tree1.dot', encoding='UTF8') as f:
dot_graph = f.read()
display(graphviz.Source(dot_graph))
from subprocess import check_call
check_call(['dot','-Tpng','tree.dot','-o','tree.png'])
from subprocess import check_call
check_call(['dot','-Tpng','tree1.dot','-o','tree1.png'])
# 0~1사이의 숫자로 표현
# 1에 가까울수록 중요, 0에 가까울수록 중요하지 않음
# 전체 합이 1
fi = tree1.feature_importances_
# 2.80252522e-03 : 부동소수점 표현 방법
# 2.80252522 : 무조건 일의 자리 숫자로 표현
# e-03 : 10의 -3제곱
fi
X_one_hot.columns
df = pd.DataFrame(fi, index = X_one_hot.columns)
# by = 정렬 기준(컬럼이름을 지정안하면 0부터 붙음)
df.sort_values(by = 0, ascending=False)
from sklearn.model_selection import cross_val_score
# 사용 할 모델, 문제데이터, 답데이터, cv = 데이터 분할 수(주로 5 사용. train:test = 4:1)
score = cross_val_score(tree, X_train, y_train, cv = 5)
tree.score(X_train, y_train)
tree1.score(X_test, y_test)
# 5번 학습한 결과
score