Python机器学习(二)
2.1分类和回归的区别
关于回归和分类
回归:任务的目标是预测一个连续值,其输出结果具有连续性。
分类:进行分类,输出结果不连续。
2.2泛化、过拟合、欠拟合
泛化:模型能够对没有见过的数据做出准确的预测
过拟合:对现有信息量来说过于复杂的模型,就是对要求符合条件的对象的这个条件过于细化导致不能很好的泛化到新数据上。
欠拟合:要求的条件过于简单
很好的拟合:具有最好泛化性能的模型。
模型复杂度与数据集大小的关系:数据集中包含的数据点的变化范围越大,在不发生过拟合的条件下,可以使用的模型就越复杂–>大的数据集较优。
2.3监督学习算法
2.3.1样本数据集
两个低维的数据集:
1)二分类数据集
#生成forge样本的特征X和目标y
X, y=mglearn.datasets.make_forge()
#使用特征X的第0列和第1列作为绘制的横坐标和纵坐标,目标y作为图案
mglearn.discrete_scatter(X[:,0],X[:,1],y)
# 在右下角画一个图案的文字说明,即2个分类
plt.legend(["Class 0","Class 1"],loc=4)
#横纵坐标说明
plt.xlabel("First feature")
plt.ylabel("Second feature")
print("X.shape:{}".format(X.shape))
plt.show()
生成的图片
2)利用wave数据集说明回归算法
X,y=mglearn.datasets.make_wave(n_samples=40)
#绘制X,y以及‘o’代表圆点
plt.plot(X,y,'o')
#y轴上的最大值和最小值
plt.ylim(-3,3)
plt.xlabel("Feature")
plt.ylabel("Target")
3)K-NN算法
例:单一最近邻模型对forge数据集的预测
mglearn.plots.plot_knn_classification(n_neighbors=1)
引入了三个新的数据点,标记了训练集中与它最近的点。单一最近邻算法的预测结果就是那个点的标签(对应五角星的颜色)。
当考虑多个近邻的情况,用“投票法”指定标签,将出现更多的类别作为预测结果。
#首先将数据集分为训练集和测试集
from sklearn.model_selection import train_test_split
X,y=mglearn.datasets.make_forge()
X_train,X_test,y_train,y_test =train_test_split(X,y,random_state=0)
#导入类并将其实例化,设置参数为3
from sklearn.neighbors import KNeighborsClassifier
clf=KNeighborsClassifier(n_neighbors=3)
#利用训练集对分类器进行拟合,对于KNeighbotsClassifier来说就是保存数据集,以便在预测时计算
clf.fit(X_train,y_train)
#调用predict方法对测试数据进行预测。
# 对于测试集中每个数据点,都要计算它在训练集的最近邻,然后找出其中出现次数最多的类别
print("Test set predictions:{}".format(clf.predict(X_test)))
#为评估模型泛化能力的好坏,对测试数据和测试标签调用score方法
print("Test set accuracy:{:.2f}",format(clf.score(X_test,y_test)))
补充:对random_state的理解:
这里的random_state就是为了保证程序每次运行都分割一样的训练集合测试集。否则,同样的算法模型在不同的训练集和测试集上的效果不一样。
当你用sklearn分割完测试集和训练集,确定模型和促初始参数以后,你会发现程序每运行一次,都会得到不同的准确率,无法调参。这个时候就是因为没有加random_state。加上以后就可以调参了。
———————————————— 版权声明:本文为CSDN博主「水木小僧」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Tony_Stark_Wang/article/details/80407923
也就是说,为了方便调用给random_state设置了一个值
根据平面中每个点所属的类别对平面进行着色使决策边界可视化
fig,axes=plt.subplots(1,3,figsize=(10,3))
for n_neighbors,ax in zip([1,3,9],axes):
#fit方法返回对象本身,所以我们可以将实例化和拟合放在一行代码中
clf=KNeighborsClassifier(n_neighbors=n_neighbors).fit(X,y)
mglearn.plots.plot_2d_separator(clf,X,fill=True,eps=0.5,ax=ax,alpha=.4)
mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=ax)
ax.set_title("{} neighbor(s)".format(n_neighbors))
ax.set_xlabel("feature 0")
ax.set_ylabel("feature 1")
axes[0].legend(loc=3)
由图得单一邻居绘制的决策边界紧跟着训练数据。随着邻居个数越来越多,决策边界也越来越平滑。更平滑的边界对应更简单的模型。即使用更少的邻居对应更高的模型复杂度。
下面验证一下模型复杂度与泛化能力的关系。利用现实世界的乳腺癌数据集进行研究。
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
cancer= load_breast_cancer()
X_train,X_test,y_train,y_test = train_test_split(
cancer.data,cancer.target,stratify=cancer.target,random_state=66
)
#定义两个数组
training_accuracy = []
test_accuracy = []
#n_neighbors取值从1-10
neighbors_settings = range(1,11)
for n_neighbors in neighbors_settings:
#构建模型
clf = KNeighborsClassifier(n_neighbors=n_neighbors)
clf.fit(X_train,y_train)
# 记录训练集精度
training_accuracy.append(clf.score(X_train,y_train))
# 记录泛化精度
test_accuracy.append(clf.score(X_test,y_test))
plt.plot(neighbors_settings,training_accuracy,label="training accuracy")
plt.plot(neighbors_settings,test_accuracy,label="test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("n_neighbors")
#plt.legend()函数可以实现对图像加图例
plt.legend()
plt.show()