(1)neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=1)
n_neighbors:用于指定近邻样本个数K,默认为5
weights:用于指定近邻样本的投票权重,默认为'uniform',表示所有近邻样本的投票权重一样;如果为'distance',则表示投票权重与距离成反比,即近邻样本与未知类别的样本点距离越远,权重越小,反之,权重越大
algorithm:用于指定近邻样本的搜寻算法,如果为'ball_tree',则表示使用球树搜寻法寻找近邻样本;如果为'kd_tree',则表示使用KD树搜寻法寻找近邻样本;如果为'brute',则表示使用暴力搜寻法寻找近邻样本。默认为'auto',表示KNN算法会根据数据特征自动选择最佳的搜寻算法
leaf_size:用于指定球树或KD树叶子节点所包含的最小样本量,它用于控制树的生长条件,会影响树的查询速度,默认为30
metric:用于指定距离的度量指标,默认为闵可夫斯基距离
p:当参数metric为闵可夫斯基距离时,p=1,表示计算点之间的曼哈顿距离;p=2,表示计算点之间的欧氏距离;该参数的默认值为2
metric_params:为metric参数所对应的距离指标添加关键字参数
n_jobs:用于设置KNN算法并行计算所需的CPU数量,默认为1表示仅使用1个CPU运行算法,即不使用并行运算功能
(2)sklearn.model_selection.cross_val_score(estimator,X,y=None,groups=None,scoring=None,cv=’warn’,n_jobs=None,verbose=0,fit_params=None,pre_dispatch=‘2*n_jobs’,error_score=’raise-deprecating’)¶
estimator:训练模型函数
X:用于该模型训练的特征值
y:用于该模型训练的标签值
cv:交叉验证迭代的次数
n_jobs:用于设置交叉验证算法并行计算所需的CPU数量,默认为1表示仅使用1个CPU运行算法,即不使用并行运算功能
(3)train_test_split(test_size,train_size,random_state,shuffle,stratify)
test_size:为int数值时,表示选取样本数量,为浮点型时,便是百分比。
train_size:与test_size参数差不多
random_state:随机生成树的种子,与np.random.random(12)相仿
shuffle:是否进行洗牌操作
stratify:如果shuffle为None,则进行分层标签
二、Knn算法实战(知识接收水平判别)
(1)实验步骤
加载数据并划分为训练集和测试集
交叉验证选取最优K值
将不同K值的得分进行可视化(可选)
将最优K值进行模型训练及混淆矩阵可视化
模型整体准确率及报告输出
(2)代码实现
选取最优K值
1 defdata_set():2 """
3 加载数据并构造训练集和测试集为模型准备4 """
5 #导入第三方库
6 importpandas as pd7 from sklearn importmodel_selection8 #导入数据
9 Knowledge = pd.read_excel(r'Knowledge.xlsx')10 #将数据集拆分为训练集和测试集
11 predictors = Knowledge.columns[:-1] #提取特征名
12 X_train, X_test, y_train, y_test =model_selection.train_test_split(Knowledge[predictors], Knowledge.UNS,13 test_size = 0.25, random_state = 1234)14 return X_train, X_test, y_train, y_test
1 defchoose_bestK(X_train,y_train):2 """选取K值最优解"""
3 #导入第三方库
4 importnumpy as np5 from sklearn importneighbors6 from sklearn importmodel_selection7
8 #设置K值最大值
9 K = np.arange(1,np.ceil(np.log2(Knowledge.shape[0])))10 #构建空列表用于存储平均准确率
11 accureccy =[]12 for k inK:13 #使用10重交叉验证的方法,比对每一个k值下KNN模型的预测准确率
14 cv_result = model_selection.cross_val_score(neighbors.KNeighborsClassifier(n_neighbors=int(k),weights='distance'),15 X_train, y_train, cv = 10, scoring='accuracy')16 accureccy.append(cv_result.mean())17 arg_maxK =np.array(accureccy).argmax()18 return K,accureccy,arg_maxK
1 defvisual(K,accureccy,arg_maxK):2 """对不同K值得分进行可视化"""
3 #导入第三方库
4 importmatplotlib.pyplot as plt5
6 #中文和负号的正常显示
7 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']8 plt.rcParams['axes.unicode_minus'] =False9
10 plt.plot(K,accureccy)11 plt.scatter(K,accureccy)12 plt.text(K[arg_max], accuracy[arg_max], '最佳k值为%s' %int(K[arg_max]))13 #显示图形
14 plt.show()
1 if __name__=='__main__':2 """代码测试"""
3 X_train, X_test, y_train, y_test=data_set()4 K,accureccy,arg_maxK =choose_bestK(X_train,y_train)5 visual(K,accureccy,arg_maxK)
结果:
模型训练并用混淆矩阵可视化
1 defModel_train_predict(K,X_train, y_train,X_test):2 """模型训练及预测"""
3 #导入第三方库
4 from sklearn importneighbors5
6 #重新构建模型,并将最佳的近邻个数设置为6
7 knn_class = neighbors.KNeighborsClassifier(n_neighbors = K, weights = 'distance')8 #模型拟合
9 knn_class.fit(X_train, y_train)10 #模型在测试数据集上的预测
11 predict =knn_class.predict(X_test)12 #构建混淆矩阵
13 cm =pd.crosstab(predict,y_test)14 returncm,predict
1 defConfusion_matrix_hp(cm):2 """构造混淆矩阵热度图"""
3 #导入第三方库
4 from sklearn importmetrics5 importseaborn as sns6
7 #将混淆矩阵构造成数据框,并加上字段名和行名称,用于行或列的含义说明
8 cm =pd.DataFrame(cm)9 #绘制热力图
10 sns.heatmap(cm, annot = True,cmap = 'GnBu')11 #添加x轴和y轴的标签
12 plt.xlabel('Real Lable')13 plt.ylabel('Predict Lable')14 #图形显示
15 plt.show()
1 if __name__=='__main__':2 """代码测试"""
3 X_train, X_test, y_train, y_test=data_set()4 K,accureccy,arg_maxK =choose_bestK(X_train,y_train)5 cm,predict =Model_train_predict(K,X_train, y_train,X_test,y_test)6 Confusion_matrix_hp(cm)
结果:
模型整体准确率及报告输出
1 defscore_report(y_test,predict):2 """模型准确率及报告输出"""
3 #导入第三方模块
4 fromsklearn impmetricsrics5
6 #模型整体的预测准确率
7 total_score=metrics.scorer.accuracy_score(y_test, predict)8 #分类模型的评估报告
9 report =metrics.classification_report(y_test, predict)10 return total_score,report
1 if __name__=='__main__':2
3 """代码测试"""
4 X_train, X_test, y_train, y_test=data_set()5 K,accureccy,arg_maxK =choose_bestK(X_train,y_train)6 cm,predict =Model_train_predict(K,X_train, y_train,X_test,y_test)7 total_score,report =score_report(y_test,predict)8 print(total_score,"\n",report)
结果:
借鉴:《从零开始学Python数据分析与挖掘》 PPT