# -*- coding: utf-8 -*-
#鸢尾花
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import mglearn
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
iris_dataset=load_iris()#Bunch类型
print({"Keys of iris_dataset: \n{}".format(iris_dataset.keys())})
#DESCR--数据集的简要说明
print("DESCR: \n{}".format(iris_dataset["DESCR"][:193]+"\n..."))
#-------------------------------------------------------------------------------------------
#泛化,训练数据,测试数据
#X-数据
#y-标签
X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
#--------------------------------------------------------------------------------------------------------------------
#散点图矩阵scatter_matrix,两两特征作图
#将数据转为dataframe
#pandas.scatter_matrix(DateFrame, alpha=0.5, figsize=None, ax=None, diagonal='hist', marker='.',
# density_kwds=None,hist_kwds=None, range_padding=0.05, **kwds)
#alpha:float 图像透明度. figsize:以英寸为单位的图像大小. ax:(Matplotlib axis object, 可选),一般取None
#diagonal:({‘hist’, ‘kde’}),’hist’表示直方图,’kde’表示核密度估计
#marker:标记类型:.,,o...
#density_kwds:与kde相关的字典参数, hist_kwds:与hist相关的字典参数
#range_padding:float,图像在x轴、y轴原点附近的留白,该值越大,留白距离越大,图像远离坐标原点
#kwds:与scatter_matrix函数本身相关的字典参数
iris_dataframe=pd.DataFrame(data=X_train,columns=iris_dataset['feature_names'])
pd.scatter_matrix(iris_dataframe,c=y_train,figsize=(10,10),marker='o',hist_kwds={'bins':20},s=60,alpha=0.8,cmap=mglearn.cm3)
#---------------------------------------------------------------------------------------------------------------------
#分类算法--k邻近,KNN
#实例化,设置邻居数目
knn=KNeighborsClassifier(n_neighbors=1)
#sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’,
# leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=1, **kwargs)
#weight:近邻的权重,'uniform':一样,'distance':距离的倒数
#algorithm:算法,'auto':fit,'ball_tree':BallTree,'kd_tree':KDTree,'brute':brute-force search
#leaf_size:int. 传入BallTree或者KDTree算法的叶子数量。此参数会影响构建、查询BallTree或者KDTree的速度,以及存储BallTree或者KDTree所需要的内存大小。 此可选参数根据是否是问题所需选择性使用。
#p: 用于Minkowski metric
#metric:矩阵,'string' or 'callable',用于树的距离矩阵
#metric_params:dict,矩阵参数
#n_jobs: int 用于搜索邻居的,可并行运行的任务数量
#拟合模型(训练数据,训练标签)
knn.fit(X_train,y_train)
#预测测试数据并评估
#将数据转为二维数组(sklearn输入数据必须是二维数组)
y_pred=knn.predict(X_test)
np.mean(y_pred==y_test)#0.97
#法2:
knn.score(X_test,y_test)
#返回给定测试数据和标签的平均准确度。