# 周末AI课堂 非参模型初步代码篇：机器学习你会遇到的“坑”

AI课堂开讲，就差你了！

、与以往的代码篇不同，因为这次的非参数模型理论上并不复杂，对参数的理解更为关键，所以我们会着重于将K近邻的几个重要的超参数做出详细的解释，并与我们的图像一一对应起来。首先，我们会对用K近邻分类器对IRIS数据进行分类，采取简单投票法和距离的加权平均投票法观察分类的效果，同时，我们不同的距离度量和不同的K近邻进一步的观察它们对决策边界的影响。最后我们利用决策树来对整个iris数据进行处理，并充分利用决策树良好的可解释性，来画出整个树。

import matplotlib.pyplot as pltimport seaborn as sns

from sklearn import datasets

iris=datasets.load_iris()

X = iris.data[:, :2]

y = iris.target

sns.set(style='darkgrid')

for c,i,names in zip("rgb",[0,1,2],iris.target_names):

plt.scatter(X[y==i,0],X[y==i,1],c=c,label=names)

plt.title('IRIS')

plt.legend()

plt.show()

......from sklearn import neighbors, datasets

def make_meshgrid(x, y, h=.02):

x_min, x_max = x.min() -1, x.max() +1 y_min, y_max = y.min() -1, y.max() +1 xx, yy =np.meshgrid(np.arange(x_min, x_max, h),

np.arange(y_min,y_max, h))

return(xx, yy)

xx,yy=make_meshgrid(X[:,0],X[:,1])

for weights in ['uniform', 'distance']:

clf = neighbors.KNeighborsClassifier(7, weights=weights)

clf.fit(X, y)

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

plt.figure()

plt.contourf(xx,yy,Z,cmap=plt.cm.RdBu,alpha=0.8)

for c,i,names in zip("rgb",[0,1,2],iris.target_names):

plt.scatter(X[y==i,0],X[y==i,1],c=c,label=names,edgecolor='k')

plt.title("3-Class classification (k = %i, weights = '%s')"% (7, weights))

plt.legend()

plt.show()

......for k in [1,27]:

clf = neighbors.KNeighborsClassifier(k, weights='distance')

clf.fit(X, y)

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

plt.figure()

plt.contourf(xx,yy,Z,cmap=plt.cm.RdBu,alpha=0.8)

for c,i,names in zip("rgb",[0,1,2],iris.target_names):

plt.scatter(X[y==i,0],X[y==i,1],c=c,label=names,edgecolor='k')

plt.title("3-Class classification (k = %i, weights = '%s')"% (k,'distance'))

plt.legend()

plt.show()

......for dist in ['manhattan','chebyshev']:

clf = neighbors.KNeighborsClassifier(7, weights='distance',metric=dist)

clf.fit(X, y)

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

plt.figure()

plt.contourf(xx,yy,Z,cmap=plt.cm.RdBu,alpha=0.8)

for c,i,names in zip("rgb",[0,1,2],iris.target_names):

plt.scatter(X[y==i,0],X[y==i,1],c=c,label=names,edgecolor='k')

plt.title("3-Class classification (k = %i, distance = '%s')"% (7,dist))

plt.legend()

plt.show()

import numpy as npimport matplotlib.pyplot as plt

from sklearn import datasets

from sklearn.tree import DecisionTreeClassifieras DTC

iris = datasets.load_iris()

X = iris.data[:, :2]

y = iris.target

def make_meshgrid(x, y, h=.02):

x_min, x_max = x.min() -1, x.max() +1 y_min, y_max = y.min() -1, y.max() +1 xx, yy =np.meshgrid(np.arange(x_min, x_max, h),

np.arange(y_min,y_max, h))

return(xx, yy)

xx,yy=make_meshgrid(X[:,0],X[:,1])

clf =DTC(criterion='entropy')

clf.fit(X, y)

Z =clf.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

plt.figure()

plt.contourf(xx,yy,Z,cmap=plt.cm.RdBu,alpha=0.6)

for c,i,names in zip("rgb",[0,1,2],iris.target_names):

plt.scatter(X[y==i,0],X[y==i,1],c=c,label=names,edgecolor='k')

plt.title("DecisionTree")

plt.legend()

plt.show()

import graphvizfrom sklearn import datasets

from sklearn.tree import DecisionTreeClassifieras DTC

from sklearn import tree

iris = datasets.load_iris()

X = iris.data

y = iris.target

clf=DTC(criterion='entropy')

clf.fit(X,y)

dot_data=tree.export_graphviz(clf,out_file=None,

feature_names=iris.feature_names,

class_names=iris.target_names,

filled=True, rounded=True,

special_characters=True)

graph=graphviz.Source(dot_data)

graph.render('IRIS')

• 有一个非常重要的问题，即K近邻算法中明明出现了参数K，它为什么还是一个非参数算法呢？原因仍然在于，所谓的K并不是模型学得的，也不是需要优化的，而是我们事先指定好的，这就是超参数和参数的区别。

• 我们会在很多地方看到懒惰学习的叫法，而K近邻一般都会作为其代表，但事实上，决策树也可以是懒惰的，具体请看这篇论文：

https://pdfs.semanticscholar.org/38b0/877fa6ac3ebfbb29d74f761fea394ee190f3.pdf

• 要获得决策树的推断图，需要安装python库 graphviz，直接用pip install graphviz即可安装。

• 发表于:
• 原文链接https://kuaibao.qq.com/s/20180812A198ZA00?refer=cp_1026
• 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号（企鹅号）传播渠道之一，根据《腾讯内容开放平台服务协议》转载发布内容。
• 如有侵权，请联系 cloudcommunity@tencent.com 删除。

2022-07-02

2022-07-02

2022-07-02

2022-07-02

2022-07-02

2022-07-02

2018-05-16

2018-05-11

2018-03-29

2022-07-02

2022-07-02

2022-07-02