鸢尾花的数据分析
- target : 目标值,代表着类别(c)
- datasets.load_iris()得到的不是字典是普通的hash类型,因为pandas,matplotlib,sklearn,numpy都是由c封装的,所有的库不是python写的都是由c封装的
- 是一个元类
In [2]:
#target : 目标值,代表着类别,
#得到的不是字典是普通的hash类型
from sklearn import datasets
iris = datasets.load_iris()
In [3]:
#DESCR得到的是英文文档,需要print解析(内有大量的\n,\t)
# print(iris.DESCR)
In [4]:
data = iris.data
target = iris.target
target_names = iris.target_names
In [5]:
from sklearn.model_selection import train_test_split
- 数据的预备部分,,切割成四部分,按()内先后的位置,(可以按比例切),测试部分占10%
- 随机切分的
In [26]:
X_train,X_test,y_train,y_test = train_test_split(data,target,test_size=0.1)
- 进行训练(只是为了训练出一组数学模型)
- k : n_neighbors=5
- n_jobs=2 : 用几个进程(核数),核心数量越多,则运作的越快
In [27]:
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5,n_jobs=2)
knn.fit(X_train,y_train)
Out[27]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=2, n_neighbors=5, p=2,
weights='uniform')
- 进行评估(传入的值任然是训练时的值但是评估结果不是1,则这种评估的结果就是准确率)
In [28]:
knn.score(X_train,y_train)
Out[28]:
0.9703703703703703
- 进行测试
In [29]:
y_pred = knn.predict(X_test)
- 准确率判断原理(利用的是广播机制,索引对比)
In [30]:
import pandas as pd
import numpy as np
np.sum(y_test==y_pred)/len(y_test)
Out[30]:
0.9333333333333333
In [15]:
import matplotlib.pyplot as plt
plt.scatter(data[:,0],data[:,1],c=target)
Out[15]:
<matplotlib.collections.PathCollection at 0x27b0250ae80>
拟合 : 让测试的和真实的很接近(相似度)
- 过拟合 : 训练评估的值高(1.0),测试的值(准确率)低(0.92) /0.98 对 0.89(训练的数据中没有异常值)
- 欠拟合 : 两者都低,或则差异较大(一般不会出现这种情况,数据量及其少的时候会出现)
网格搜索(找值高的)和交叉验证(找相对较高的)(优化算法)
- grid search & cross validation
- GridSearchCV (可见网络搜索较重要一些)
-
estimator : 估计器,算法(要求写算法的实例,knn)
-
param_grid : 估计器的参数,k的值,要求是一个散列表(n_neighbors:[1,3,5,7,10])(散列类型,hash)
- cv : 指定折交的次数
- 网络搜索 : 用for循环遍历k 的值然后训练得分(计算量较大)
- 交叉验证 : 数据部分,多次抽取数据进行验证(3/7每次抽取70%),大量的随机测试保证模型的稳定性
-
效率低下 : k的值可以取16,一共抽取十组数据 ,效率比之前低160倍
-
优化找到k的哪个数量值比较合适(让测量值和真实值比较接近)
模型产生的结果
-
bestparams : 最稳定,模型产生最好的结果的参数
-
bestscore :评估结果既稳定,又高的一次
-
bestestimator :最好的模型
泛化性 / 鲁棒性 / 稳定性
- 应用与哪种数据都可以,分辨的错误率不高,
In [83]:
from sklearn.model_selection import GridSearchCV
In [84]:
knn = KNeighborsClassifier()
In [85]:
param_grid = {'n_neighbors':list(range(1,26))}
In [86]:
gc = GridSearchCV(estimator = knn,param_grid = param_grid,cv=3,n_jobs=2)
In [87]:
gc.fit(X_train,y_train)
Out[87]:
GridSearchCV(cv=3, error_score='raise',
estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='uniform'),
fit_params=None, iid=True, n_jobs=2,
param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]},
pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',
scoring=None, verbose=0)
In [88]:
best_pa = gc.best_params_
In [89]:
best_knn = gc.best_estimator_
In [90]:
gc.best_score_
Out[90]:
0.9703703703703703
In [91]:
best_knn.score(X_train,y_train)
Out[91]:
0.9703703703703703
In [92]:
best_knn.score(X_test,y_test)
Out[92]:
0.9333333333333333
In [ ]: