机器学习笔记3:分类——练习题
1.为MNIST数据集构建一个分类器,并在测试集上达成超过97%的准确率。提示:KNeighborsClassifier对这个任务非常有效,你只需要找到合适的超参数值即可(试试对weightsn_neighbors这两个超参数进行网格搜索)。
如果你了解knn算法,你会清楚知道这个算法是多么的耗时,大数据量+网格搜索+交叉验证,一套下来需要十多个小时
from sklearn.model_selection import GridSearchCV param_grid = [{weights: ["uniform", "distance"], n_neighbors: [3, 4, 5]}] knn_clf = KNeighborsClassifier() grid_search = GridSearchCV(knn_clf, param_grid, cv=5, verbose=3) grid_search.fit(X_train, y_train)
grid_search.best_params_ ## {n_neighbors: 4, weights: distance} grid_search.best_score_ ## 0.9716166666666666 from sklearn.metrics import accuracy_score y_pred = grid_search.predict(X_test) accuracy_score(y_test, y_pred) ## 0.9714
2.写一个可以将MNIST图片向任意方向(上、下、左、右)移一
个像素的功能[1]。然后对训练集中的每张图片,创建四个位移后的副本(每个方向一个),添加到训练集。最后,在这个扩展的训练集上训练模型,测量其在测试集上的准确率。你应该能注意到,模型的表现甚至变得更好了!这种人工扩展训练集的技术称为数据增广或训练集扩展。
你可以利用scipy.ndimage.interpolation模块中的shift()函数。例如,shift(image,[2,1],cval=0)将图形向下移动两个像素,向右移动一个像素
def shift_image(image, dx, dy): image = image.reshape((28, 28)) shifted_image = shift(image, [dy, dx], cval=0, mode="constant") return shifted_image.reshape([-1]) image = X_train[1000] shifted_image_down = shift_image(image, 0, 5) shifted_image_left = shift_image(image, -5, 0) plt.figure(figsize=(12,3)) plt.subplot(131) plt.title("Original", fontsize=14) plt.imshow(image.reshape(28, 28), interpolation="nearest", cmap="Greys") plt.subplot(132) plt.title("Shifted down", fontsize=14) plt.imshow(shifted_image_down.reshape(28, 28), interpolation="nearest", cmap="Greys") plt.subplot(133) plt.title("Shifted left", fontsize=14) plt.imshow(shifted_image_left.reshape(28, 28), interpolation="nearest", cmap="Greys") plt.show()
3.Kaggle上非常棒的起点:处理泰坦尼克(Titanic)数据集。
这个网上已经有很多不错的解决方案了,可以移步去搜索
4.创建一个垃圾邮件分类器(更具挑战性的练习):
-
从Apache SpamAssassin的公共数据集中下载垃圾邮件和非垃圾邮件。 解压数据集并熟悉数据格式。 将数据集分为训练集和测试集。 写一个数据准备的流水线将每封邮件转换为特征向量。你的流水线应将电子邮件转换为一个“指示出所有可能的词存在与否”的(稀疏)向量。比如,如果所有的邮件都只包含四个词“Hello”“how”“are”“you”,那么邮件“Hello you Hello Hello you”会被转换成为向量[1,0,0,1](意思是“Hello”存在,“how”不存在,“are”不存在,“you”存在),如果你希望算上每个词出现的次数,那么这个向量就是[3,0,0,2]。在流水线上添加超参数来控制是否剥离电子邮件标题,是否将每封邮件转换为小写,是否删除标点符号,是否将“URLs”替换成“URL”,是否将所有小写number替换为“NUMBER”,甚至是否执行词干提取(即去掉单词后缀,有可用的Python库可以实现该操作)。最后,多试几个分类器,看看是否能创建出一个高召回率且高精度的垃圾邮件分类器。
工作量太大了,有空一定!
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
JDK16安装教程,尝鲜开始咯