# -*- 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)
        #返回给定测试数据和标签的平均准确度。