avatar

目录
无题

title: knn应用(癌症判断)
date: 2020-02-03 15:54:50
categories: 机器学习
tags: [KNN,应用,参数]
cover: /img/me.jpg

KNN简介

KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

距离矩阵和k都是超参数

参数与超参数

  1. 参数(parameters)/模型参数
     由模型通过学习得到的变量,比如权重和偏置

  2. 超参数(hyperparameters)/算法参数
    根据经验进行设定,影响到权重和偏置的大小,比如迭代次数、隐藏层的层数、每层神经元的个数、学习速率等

实战

属性信息:

  1. Sample code number: id number
  2. Clump Thickness: 1 - 10
  3. Uniformity of Cell Size: 1 - 10
  4. Uniformity of Cell Shape: 1 - 10
  5. Marginal Adhesion: 1 - 10
  6. Single Epithelial Cell Size: 1 - 10
  7. Bare Nuclei: 1 - 10
  8. Bland Chromatin: 1 - 10
  9. Normal Nucleoli: 1 - 10
  10. Mitoses: 1 - 10
  11. Class: (2 for benign, 4 for malignant)(2为良性,4为恶性)

为数据添加label,在第一行加入id,clump_thickness,uniform_cell_size,
uniform_cell_shape,marginal_adhesion,
single_epi_cell_size,bare_nuclei,bland_chromation,
normal_nucleoli,mitoses,class

数据样式:
clumb_thickness unif_cell_size unif_cell_shape marg_adhesion single_epith_cell_size bare_nuclei bland_chrom norm_nucleoli mitoses class
0 5 1 1 1 2 1 3 1 1 2
1 5 4 4 5 7 10 3 2 1 2
2 3 1 1 1 2 2 3 1 1 2
3 6 8 8 1 3 4 3 7 1 2
4 4 1 1 3 2 1 3 1 1 2

python
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
26
27
28
29
30
31
import numpy as np
from sklearn import preprocessing ,model_selection,neighbors
from sklearn.linear_model import LinearRegression
import pandas as pd

df = pd.read_csv('breast-cancer-wisconsin.txt')#encoding='utf-8',header=None,sep = '\t'
df.replace('?',-99999, inplace=True)
#print([column for column in df])
df.drop(['id'], 1, inplace=True) #df.drop returns a new dataframe with our chosen column(s) dropped.
#df=df.iloc[:,1:]#.iloc使用全是以0开头的行号和列号,不能直接用其它索引哦。而.loc使用的实际设置的索引和列名。 这就是.loc和.iloc的区别。在实际运用中,我还发现一点区别,.iloc只能选取数据表里实际有的行和列,而.loc可以选取没有的行和列,赋值后就可以添加新行或者列。
X = np.array(df.drop(['class'],1))
y = np.array(df['class'])

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.2)

#print([column for column in df])
#clf = LinearRegression(n_jobs=-1)#SVM.svr() kernel='poly'
clf = neighbors.KNeighborsClassifier()
clf.fit(X_train,y_train)

accuracy = clf.score(X_test,y_test)
print(accuracy)
print(df.head())

#example_measures = np.array([4,2,1,1,1,2,3,2,1]) #一个sample
#example_measures = example_measures.reshape(1, -1) #Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample
example_measures = np.array([[4,2,1,1,1,2,3,2,1],[4,2,1,1,1,2,3,2,1]])#测试用例
example_measures = example_measures.reshape(len(example_measures), -1)
prediction = clf.predict(example_measures)

print(prediction)

accuracy:0.9714285714285714
预测结果:prediction[2 2] 两个都为良性

文章作者: Sunxin
文章链接: https://sunxin18.github.io/2020/04/29/knn/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lalala
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论