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")
|
考虑更多的点后,曲线更加平滑,,但拟合不够好
优缺点&参数:
KNeighbors有两个重要参数:邻居个数(3or5or..)和数据点之间距离的度量方法(默认欧氏距离)
优缺点:模型容易理解。构建最近邻模型的速度通常很快,但若训练集很大,预测速度可能会比较慢,不能处理很多特征的数据集。
标签:neighbors,cancer,MyBlog,train,test,ax,reg
来源: https://www.cnblogs.com/lijianming180/p/12433367.html