Advertisement

Python 数据集:乳腺癌数据集(from sklearn.datasets import load_breast_cancer)。

阅读量:

数据集:乳腺癌数据集(from sklearn.datasets import load_breast_cancer)。

(1)将样本集划分为70%作为训练集与30%作为测试集,并分别采用逻辑回归模型与K近邻分类器进行建模(在建模前需对数据进行标准化处理),随后生成相应的评估指标报告以计算模型性能指标包括准确率、召回率以及假阳性率。

(2)通过搜索网格方法分别设置逻辑回归和KNN模型的最佳参数组合。
KNN算法的关键参数包括:
①n_neighbors(最近邻个数)
建议选择奇数值以避免平局情况。
②algorithm(用于计算最近邻的算法)
可选类型包括'auto'、'ball_tree'、'kd_tree'和'brute'等,默认采用'auto'策略。需要注意的是,不同算法对KNN性能的影响主要体现在计算速度上,并不会改变最终结果。
③p(Minkowski距离的指标参数)
默认值为2,对应欧氏距离;若选用曼哈顿距离则设为1。若需应用其他非明氏距离指标,则需修改metric参数设置。
④weights(权重函数)
决定预测结果中各邻居点权重分配的方式:可以选择统一权重或根据距离衰减的权重两种方案。

(3)在全部数据集上实施采用K折交叉验证法的方式,并分别运用逻辑回归与KNN算法进行建模(以上一步骤所得的最佳参数设置为基础),并绘制对比各k值对应的分类精度曲线。

在这里插入图片描述
复制代码
    #!/usr/bin/env python
    # coding: utf-8
    
    
    
    from sklearn.datasets import load_breast_cancer
    import numpy as np
    from sklearn import linear_model, model_selection
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import LogisticRegression
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.metrics import confusion_matrix
    from sklearn import datasets
    from sklearn.model_selection import GridSearchCV
    from sklearn.model_selection import cross_val_score
    np.set_printoptions(suppress= True) 
    np.set_printoptions(precision=4)
    # from pylab import mpl
    # mpl.rcParams['font.sans-serif'] = ['SimHei']    # 指定默认字体:解决plot不能显示中文问题
    # mpl.rcParams['axes.unicode_minus'] = False      # 解决保存图像是负号'-'显示为方块的问题
    
    
    
    
    dataset = datasets.load_breast_cancer()
    data = dataset.data
    target = dataset.target
    
    
    
    
    x_train, x_test, y_train, y_test = model_selection.train_test_split(data,target,
                                                    test_size=0.3,random_state=1)
    
    
    
    
    model_logic = LogisticRegression(max_iter=10000).fit(x_train, y_train.ravel())
    
    print(model_logic.score(x_test,y_test))
    
    y_pred = model_logic.predict(x_test)
    
    
    
    
    #测试逻辑回归的模型评估
    tn, fp, fn, tp = confusion_matrix(y_test, y_pred,labels=[0,1]).ravel()
    print(tn,fp,fn,tp)
    𝑎𝑐𝑐𝑢𝑟𝑎𝑐𝑦 = (tn+tp)/(tn+tp+fn+fp)
    trp = (tp)/(tp+fn)
    fpr = (fp)/(tn+fp)
    
    print("准确率为:{}%".format(accuracy*100))
    print("查全率为:{}%".format(trp*100))
    print("假正率为:{}%".format(fpr*100))
    
    
    
    
    param =  {'penalty':['l2','l1'],'C': [0.001, 0.01, 0.1,1],
        'class_weight':['balanced',None],'multi_class':['ovr'],'solver':['liblinear']}
    gc = GridSearchCV(model_logic, param_grid=param, cv=10)
                                                    
    gc.fit(x_train, y_train)
    print("在测试集上的准确率(得分):",gc.score(x_test,y_test))
    print("交叉验证的最好结果:",gc.best_score_)
    print("最佳参数组合:",gc.best_params_)
    
    
    
    
    k=[2,3,4,5,6,7,8,9,10]
    scores = []
    model_logic = LogisticRegression(max_iter=10000,C=1, class_weight= 'balanced', 
                                 multi_class='ovr', penalty='l1', solver='liblinear')
    for i in range(0,len(k)):
    score = cross_val_score(model_logic,data,target,cv=k[i])
    scores.append(score.mean())
    print(scores)
    
    
    
    
    plt.figure()
    plt.title('逻辑回归模型的k折交叉验证得分曲线图')
    plt.plot(k,scores,'bs-')
    
    
    
    
    #对训练集和测试集的X正则化
    standardizer =  StandardScaler()
    X_std = standardizer.fit_transform(x_train)
    standardizer =  StandardScaler()
    X_std_test = standardizer.fit_transform(x_test)
    
    
    
    
    
    knn = KNeighborsClassifier ().fit(X_std, y_train)
    
    print(knn.score(X_std_test,y_test))
    
    
    
    y_pred = knn.predict(X_std_test)
    print(y_pred)
    #注意阳性为1 True Positive
    
    
    
    
    #测试KNN的模型评估
    tn, fp, fn, tp = confusion_matrix(y_test, y_pred,labels=[0,1]).ravel()
    print(tn,fp,fn,tp)
    𝑎𝑐𝑐𝑢𝑟𝑎𝑐𝑦 = (tn+tp)/(tn+tp+fn+fp)
    trp = (tp)/(tp+fn)
    fpr = (fp)/(tn+fp)
    
    print("准确率为:{}%".format(accuracy*100))
    print("查全率为:{}%".format(trp*100))
    print("假正率为:{}%".format(fpr*100))
    
    
    
    
    
    param =  {'n_neighbors': [1, 3, 5],'algorithm': ['auto','ball_tree', 'kd_tree', 'brute'],'p':[1,2],'weights':['uniform','distance']}
                                                    
    gc = GridSearchCV(knn, param_grid=param, cv=5)
                                                    
    gc.fit(x_train,y_train)
    print("在测试集上的准确率:",gc.score(x_test,y_test))
    print("交叉验证的最好结果:",gc.best_score_)
    print("最佳参数组合:",gc.best_params_)
                                                  
    
    
    
    
    k=[2,3,4,5,6,7,8,9,10]
    scores = []
    
    knn = KNeighborsClassifier(algorithm='auto', n_neighbors= 3, p= 1,weights='uniform')
    for i in range(0,len(k)):
    score = cross_val_score(knn,data,target,cv=k[i])
    scores.append(score.mean())
    print(scores)
    
    
    
    
    
    
    plt.figure()
    plt.title('knn的k折交叉验证得分曲线图')
    plt.plot(k,scores,'bs-')

为了解决图表中字符显示不正常的问题,请注意以下代码设置:from pylab import mpl;mpl.rcParams[‘font.sans-serif’] = [‘SimHei’]

在实施k-fold交叉验证与网格搜索的过程中,同样需要对测试数据进行标准化处理。由于版本问题影响了参数设置工作,并且尤其是算法选择相关的参数也无法完成设置。

全部评论 (0)

还没有任何评论哟~