码迷,mamicode.com
首页 > 其他好文 > 详细

MyBlog

时间:2020-03-07 13:21:00      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:import   state   host   red   mes   开始   结果   key   sre   

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方法评估模型,对于回归问题,这一方法返回的是R2分数。R2分数也叫做决定系数,是回归模型预测的优度度量,位于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")

技术图片

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

优缺点&参数:

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

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

MyBlog

标签:import   state   host   red   mes   开始   结果   key   sre   

原文地址:https://www.cnblogs.com/lijianming180/p/12433367.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!