KNN 鸢尾花&癌症预测 交叉验证&网格搜索 笔记

 一、交叉验证  cross_val_score:

sklearn.cross_validation.cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’)

参数

estimator:数据对象 
X:数据 
y:预测数据 
soring:调用的方法
cv:交叉验证生成器或可迭代的次数 
n_jobs:同时工作的cpu个数(-1代表全部)
verbose:详细程度
fit_params:传递给估计器的拟合方法的参数
pre_dispatch:控制并行执行期间调度的作业数量。减少这个数量对于避免在CPU发送更多作业时CPU内存消耗的扩大是有用的。该参数可以是:

  • 没有,在这种情况下,所有的工作立即创建并产生。将其用于轻量级和快速运行的作业,以避免由于按需产生作业而导致延迟
  • 一个int,给出所产生的总工作的确切数量
  • 一个字符串,给出一个表达式作为n_jobs的函数,如'2 * n_jobs'

返回

交叉验证每次运行的评分数组

 

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.model_selection import cross_val_score
#下载数据
iris=load_iris()
X=iris.data
Y=iris.target

#-------------------------------------------------------
#交叉验证
KNN=KNeighborsClassifier()
score=cross_val_score(KNN,X,Y,scoring='accuracy',cv=6) #cv为分成的等份数
score.mean()
'''
0.9660493827160493
'''

#------------------------------------------------------


#-------------------------------------------------------
#K值上限一般为样本量的平方根 
#交叉验证,挑选合适的K值
erros=[]
for k in range(1,14):
    KNN=KNeighborsClassifier(n_neighbors=k)
    score=cross_val_score(KNN,X,Y,scoring='accuracy',cv=6).mean()
    
    #误差越小,说明K选择越合适
    erros.append(1-score)

import matplotlib.pyplot as plt
import numpy as np

#K=11时,误差最小,说明K=11对该案例来说是最合适的K值
plt.plot(np.arange(1,14),erros)
#-------------------------------------------------------    



#-------------------------------------------------------    
#交叉验证,选择合适的K值及W值,该处即为模型调参
weights=['uniform','distance']
erros=[]
result={}
for k in range(1,14):
    for w in weights:
        KNN=KNeighborsClassifier(n_neighbors=k,weights=w)
        sm=cross_val_score(KNN,X,Y,scoring='accuracy',cv=6).mean()
        result[w+str(k)]=sm
np.array(list(result.values())).argmax()
result.index[20]

二、网格搜索   GridSearchCV

GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise’, return_train_score=’warn’)

 estimator:选择使用的分类器,并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法:

estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10),


param_grid:需要最优化的参数的取值,值为字典或者列表;
scoring=None:模型评价标准,默认None,这时需要使用score函数;或者如scoring='roc_auc',根据所选模型不同,评价准则不同。
n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值

cv=None  交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
 

 

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

#网格
from sklearn.model_selection import GridSearchCV
import pandas as pd


#导入数据
data=load_breast_cancer()
data_cancer=data.data
target=data.target
cancer=pd.DataFrame(data_cancer,columns=data.feature_names)
X=cancer.copy()
cancer['Diagnosis']=data.target



#分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(pd.DataFrame(data_cancer,columns=data.feature_names),data.target,test_size=0.2,random_state=44)


knn=KNeighborsClassifier()

params={"n_neighbors":[i for i in range(1,30)],
        "weights":['uniform','distance'],
        "p":[1,2]
        }

gcv=GridSearchCV(knn,params,scoring='accuracy',cv=6)

#训练集(X_train,y_train)上训练模型
gcv.fit(X_train,Y_train)

#最佳参数组合
gcv.best_estimator_
#最佳学习器的评估分数
gcv.best_score_
'''
0.9384615384615385
'''
#预测
y_=gcv.predict(X_test)

##评价准确度 :方法一
gcv.score(X_test,Y_test)

##评价准确度 :方法二
from sklearn.metrics import accuracy_score
accuracy_score(Y_test,y_)


#方法三:混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix(Y_test,y_)

#方法四:精确率、召回率、f1调和平均值

from sklearn.metrics import classification_report
print(classification_report(Y_test,y_,target_names=['B','M']))

#----------------------------------------------
###提升准确率、提升精确率、提升召回率
#数据归一化操作:方法一
X_normal=(X-X.min())/(X.max()-X.min())
#分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X_normal,data.target,test_size=0.2,random_state=44)

knn=KNeighborsClassifier()

params={"n_neighbors":[i for i in range(1,30)],
        "weights":['uniform','distance'],
        "p":[1,2]
        }

gcv=GridSearchCV(knn,params,scoring='accuracy',cv=6)

#训练集(X_train,y_train)上训练模型
gcv.fit(X_train,Y_train)

#最佳参数组合
gcv.best_estimator_
#最佳学习器的评估分数
gcv.best_score_
'''
0.9736263736263736
'''
#预测
y_=gcv.predict(X_test)

##评价准确度 :方法一
gcv.score(X_test,Y_test)
'''
0.9824561403508771
'''

#----------------------------------------------
#数据归一化操作:方法一: Z-Score归一化
X_norm2=(X-X.mean())/X.std()
X_train, X_test, Y_train, Y_test = train_test_split(X_norm2,data.target,test_size=0.2,random_state=44)

knn=KNeighborsClassifier()

params={"n_neighbors":[i for i in range(1,30)],
        "weights":['uniform','distance'],
        "p":[1,2]
        }

gcv=GridSearchCV(knn,params,scoring='accuracy',cv=6)

#训练集(X_train,y_train)上训练模型
gcv.fit(X_train,Y_train)

#最佳参数组合
gcv.best_estimator_
#最佳学习器的评估分数
gcv.best_score_
'''
0.967032967032967
'''

#预测
y_=gcv.predict(X_test)

##评价准确度 :方法一
gcv.score(X_test,Y_test)
'''
0.9736842105263158
'''




#------------------------------
from sklearn.preprocessing import MinMaxScaler,StandardScaler

#MinMaxScaler和最大值最小值归一化效果一样
mms=MinMaxScaler()
mms.fit(X)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
knn鸢尾花数据集是一个非常常用的机器学习数据集,可以用于分类算法的训练和测试。这个数据集包含了150个样本,每个样本有4个特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。这些样本被分为3个类别,分别是setosa、versicolor和virginica。 要下载knn鸢尾花数据集,我们可以使用Python编程语言来进行操作。首先,我们需要安装并导入Scikit-learn库,它提供了许多常用的机器学习数据集以及基本的预处理和建模工具。 下面是一个下载并加载knn鸢尾花数据集的示例代码: ```python from sklearn.datasets import load_iris # 下载knn鸢尾花数据集 data = load_iris() # 打印数据集的描述信息 print(data.DESCR) # 获取特征向量和标签 X = data.data y = data.target # 打印特征向量和标签的形状 print("特征向量形状:", X.shape) print("标签形状:", y.shape) # 打印前5个样本的特征向量和标签 print("前5个样本的特征向量:", X[:5]) print("前5个样本的标签:", y[:5]) ``` 运行以上代码后,就可以成功地下载并加载knn鸢尾花数据集。通过打印数据集的描述信息,我们可以了解更多关于数据集的详细信息,如样本数量、类别数量和特征的具体含义。同时,我们还可以获取样本的特征向量和标签,并根据需要进行进一步的处理和分析。 总之,knn鸢尾花数据集是一个非常适合练习和学习机器学习算法的经典数据集,通过下载和加载这个数据集,我们可以更好地理解和应用knn算法进行分类任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值