ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MyBlog

2020-03-07 12:03:00  阅读:328  来源: 互联网

标签:neighbors cancer MyBlog train test ax reg


Contents

以某州的乳腺癌数据集入手:

1.K近邻分类&分析KNeighborsClassfier

1
2
3
4
5
6
7
8
9
10
11
12
13

import matplotlib.pyplot as plt
import sklearn
import mglearn

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
print("cancer.keys(): n{}".format(cancer.keys()))

'''输出
cancer.keys():
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
'''
1
2
3
print("Shape of cancer data: {}".format(cancer.data.shape)) 
# 输出:569个数据点 每个数据点有30个特征
# Shape of cancer data: (569, 30)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print("Sample counts per class:n{}".format(
{n: v for n, v in zip(cancer.target_names, np.bincount(cancer.target))}))

# Sample counts per class:
# {'malignant': 212, 'benign': 357}
# 恶性212个,良性357个

'''备注
zip: 打包成元组
bincount: 对应索引在数组中出现的次数

例如:
x = np.array([7, 6, 2, 1, 4])
np.bincount(x)
输出:array([0, 1, 1, 0, 1, 0, 1, 1])
'''

http://localhost:8888/notebooks/%E7%9B%91%E7%9D%A3%E5%AD%A6%E4%B9%A0.ipynb

2.k近邻回归&分析KNeighborsRegressor

k近邻算法亦可用于回归。从单一近邻开始。使用wave数据集,添加3个测试数据点。

1
mglearn.plots.plot_knn_regression(n_neighbors=1)

使用多个近邻进行回归,预测结果为邻居从平均值:

1
mglearn.plots.plot_knn_regression(n_neighbors=3)

用于回归的K近邻算法在sklearn的KNeighborsRegressor类中实现。用法与KNeigh 大专栏  MyBlogborsClassfier类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.neighbors import KNeighborsRegressor

X, y = mglearn.datasets.make_wave(n_samples=40)

#将wave数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

#模型实例化,并将邻居个数设为3
reg = KNeighborsRegressor(n_neighbors=3)
#拟合模型
reg.fit(X_train, y_train)

print("Test set predictions:n{}".format(reg.predict(X_test)))

可用score方法评估模型,对于回归问题,这一方法返回的是R²分数。R²分数也叫做决定系数,是回归模型预测的优度度量,位于01(常数模型(总是预测y_train的平均值)完美预测)。

1
2
3
print("R^2: ", reg.score(X_test, y_test))

# 输出为0.83 表示拟合相对较好

查看所有特征取值对应的预测结果。创建一个由许多点组成的测试数据集并绘图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# 创建100个数据点,在-3和3之间均匀分布
line = np.linspace(-3, 3, 1000).reshape(-1, 1)# reshap()是数组对象中的方法,用于改变数组的形状。变为1列,行数自动计算
for n_neighbors, ax in zip([1, 3, 9], axes):
# 利用1个、3个或9个邻居分别进行预测
reg = KNeighborsRegressor(n_neighbors=n_neighbors)
reg.fit(X_train, y_train)
ax.plot(line, reg.predict(line))
ax.plot(X_train, y_train, '^', c=mglearn.cm2(0), markersize=8)
ax.plot(X_test, y_test, 'v', c=mglearn.cm2(1), markersize=8)
ax.set_title(
"{} neighborsn train score: {:.2f} test score: {:.2f}".format(
n_neighbors, reg.score(X_train, y_train),reg.score(X_test, y_test)))
ax.set_xlabel("Feature")
ax.set_ylabel("Target")
axes[0].legend(["Model predictions", "Training data/target", "Test data/target"], loc="best")

不同neighbor值下预测结果对比

考虑更多的点后,曲线更加平滑,,但拟合不够好

优缺点&参数:

KNeighbors有两个重要参数:邻居个数(3or5or..)数据点之间距离的度量方法(默认欧氏距离)

优缺点:模型容易理解。构建最近邻模型的速度通常很快,但若训练集很大,预测速度可能会比较慢,不能处理很多特征的数据集。

标签:neighbors,cancer,MyBlog,train,test,ax,reg
来源: https://www.cnblogs.com/lijianming180/p/12433367.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有