提交 03d21db5 编写于 作者: W wizardforcel

3.9

上级 6f2541ad
......@@ -904,3 +904,101 @@ array([0, 0, 0, 0, 0])
>>> lowest_prob_idx = np.argsort(emp_dist.pdf(X))[:5]
>>> np.all(X[sorted_idx] == X[lowest_prob_idx]) True
```
## 3.9 将 KNN 用于回归
回归在这本书的其它地方有所设计,但是我们可能打算在特征空间的“口袋”中运行回归。我们可以认为,我们的数据集要经过多道数据处理工序。如果是这样,只训练相似数据点是个不错的想法。
### 准备
我们的老朋友,回归,可以用于聚类的上下文中。回归显然是个监督学习技巧,所以我们使用 KNN 而不是 KMeans。
对于 KNN 回归来说,我们使用特征空间中的 K 个最近点,来构建回归,而不像常规回归那样使用整个特征空间。
### 操作步骤
对于这个秘籍,我们使用`iris`数据集。如果我们打算预测一些东西,例如每朵花的花瓣宽度,根据`iris`物种来聚类可能会给我们更好的结果。KNN 回归不会根据物种来聚类,但我们的假设是,相同物种的 X 会接近,或者这个案例中,是花瓣长度。
对于这个秘籍,我们使用`iris`数据集:
```py
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> iris.feature_names ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
```
我们尝试基于萼片长度和宽度来预测花瓣长度。我们同时训练一个线性回归,来对比观察 KNN 回归有多好。
```py
>>> from sklearn.linear_model import LinearRegression
>>> lr = LinearRegression()
>>> lr.fit(X, y)
>>> print "The MSE is: {:.2}".format(np.power(y - lr.predict(X),
2).mean())
The MSE is: 0.15
```
现在,对于 KNN 回归,使用下列代码:
```py
>>> from sklearn.neighbors import KNeighborsRegressor
>>> knnr = KNeighborsRegressor(n_neighbors=10)
>>> knnr.fit(X, y)
>>> print "The MSE is: {:.2}".format(np.power(y - knnr.predict(X),
2).mean())
The MSE is: 0.069
```
让我们看看,当我们让它使用最接近的 10 个点用于回归时,KNN 回归会做什么?
```py
>>> f, ax = plt.subplots(nrows=2, figsize=(7, 10))
>>> ax[0].set_title("Predictions")
>>> ax[0].scatter(X[:, 0], X[:, 1], s=lr.predict(X)*80, label='LR
Predictions', color='c', edgecolors='black')
>>> ax[1].scatter(X[:, 0], X[:, 1], s=knnr.predict(X)*80, label='k-NN
Predictions', color='m', edgecolors='black')
>>> ax[0].legend()
>>> ax[1].legend()
```
输出如下:
![](img/3-9-1.jpg)
很显然,预测大部分都是接近的。但是让我们与实际情况相比,看看 Setosa 物种的预测:
```py
>>> setosa_idx = np.where(iris.target_names=='setosa')
>>> setosa_mask = iris.target == setosa_idx[0]
>>> y[setosa_mask][:5] array([ 0.2, 0.2, 0.2, 0.2, 0.2])
>>> knnr.predict(X)[setosa_mask][:5]
array([ 0.28, 0.17, 0.21, 0.2 , 0.31])
>>> lr.predict(X)[setosa_mask][:5]
array([ 0.44636645, 0.53893889, 0.29846368, 0.27338255, 0.32612885])
```
再次观察绘图,Setosa 物种(左上方的簇)被线性回归估计过高,但是 KNN 非常接近真实值。
### 工作原理
KNN 回归非常简单,它计算被测试点的 K 个最接近点的均值。
让我们手动预测单个点:
```py
>>> example_point = X[0
```
现在,我们需要获取离我们的`our_example_point`最近的 10 个点:
```py
>>> from sklearn.metrics import pairwise
>>> distances_to_example = pairwise.pairwise_distances(X)[0]
>>> ten_closest_points = X[np.argsort(distances_to_example)][:10]
>>> ten_closest_y = y[np.argsort(distances_to_example)][:10]
>>> ten_closest_y.mean()
0.28000
```
我们可以看到它非常接近预期。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册