快捷搜索: 王者荣耀 脱发

机器学习笔记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库可以实现该操作)。最后,多试几个分类器,看看是否能创建出一个高召回率且高精度的垃圾邮件分类器。

工作量太大了,有空一定!

经验分享 程序员 微信小程序 职场和发展