0%

案例1[Digit-Recognizer]

搬运来的步骤

一. 数据分析

  1. 下载并加载数据
  2. 总体预览数据:了解每列数据的含义,数据的格式等
  3. 数据初步分析,使用统计学与绘图: 由于特征没有特殊的含义,不需要过多的细致分析

二. 特征工程
1.根据业务,常识,以及第二步的数据分析构造特征工程.
2.将特征转换为模型可以辨别的类型(如处理缺失值,处理文本进行等)

三. 模型选择
1.根据目标函数确定学习类型,是无监督学习还是监督学习,是分类问题还是回归问题等.
2.比较各个模型的分数,然后取效果较好的模型作为基础模型.

四. 模型融合
跳过,这个项目的重点是让大家都了解这个kaggle比赛怎么和算法更好的融合在一起。

五. 修改特征和模型参数
此处不做过多分析,主要是优化各个算法的参数。

  • KNN => k值
  • SVM => 惩罚系数,核函数
  • RF => 树个数,树深度,叶子数
  • PCA => 特征数 or 信息熵

数据分析

加载数据,划分数据集,分离标签
用pandas加载csv文件,MNIST数据集

1
2
3
4
5
train_data = pd.read_csv(train_data_file)
test_data = pd.read_csv(test_data_file)
sample_submission = pd.read_csv(sample_submission_file)
print(train_data.info())
print(test_data.info())

输出:

1
2
3
4
5
6
7
8
9
10
11
12
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 42000 entries, 0 to 41999
Columns: 785 entries, label to pixel783
dtypes: int64(785)
memory usage: 251.5 MB
None
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 28000 entries, 0 to 27999
Columns: 784 entries, pixel0 to pixel783
dtypes: int64(784)
memory usage: 167.5 MB
None

特征工程

我去学一下PCA再来

我已经精通PCA了: PCA降维的原理及实现

模型选择

  • 根据目标函数确定学习类型,是无监督学习还是监督学习,是分类问题还是回归问题等.
  • 比较各个模型的分数,然后取效果较好的模型作为基础模型.

对于本项目:

  • 分类问题:0~9 数字
  • 常用算法:knn、决策树、朴素贝叶斯、Logistic回归、SVM、集成方法(随机森林和 AdaBoost)(尼玛还有好多不会)

KNN

至此我终于体会到了机器学习所需要的巨大计算量。我到处吹牛的 i7-9750H 用上所有计算资源后 predict一下就花了半小时。。这谁顶得住。

1
2
3
4
5
# 感觉这个用KNN应该超简单,试一下
from sklearn import neighbors

knn = neighbors.KNeighborsClassifier(n_neighbors=10, n_jobs=-1)
knn.fit(train_set, train_label)

网格搜索,KNN的参数:

neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30,
p=2, metric=’minkowski’, metric_params=None, n_jobs=1, **kwargs)

构造一个参数

1
2
3
4
5
6
7
8
grid_param= [{
"weights": ["uniform"],
"n_neighbors": [i for i in range(1, 11)]
},{
"weights":["distance"],
"n_neighbors": [i for i in range(1, 11)],
"p": [1, 6]
}]

使用GridSearchCV训练:

1
2
3
4
5
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
grid = GridSearchCV(knn, grid_param, n_jobs=-1, verbose=2)
grid.fit(X_train_reduction, y_train)
1
2
3
4
# 最优参数
grid.best_params_
# 最优分类器
knn_clf = grid.best_estimator_

SVM

这个我会了

1
2
3
4
5
6
7
8
9
# svm 我也会了,哈哈哈
# 用高斯核函数试一下
# 10分钟过去了。。
# 40分钟过去了
# 最终时间:Wall time: 2h 40min 53s
from sklearn.svm import SVC

rbf_svc = SVC(kernel="rbf",cache_size= 4096, gamma=1)
%time rbf_svc.fit(train_set, train_label)

使用pca降维后的数据:

1
2
3
# Wall time: 9min 36s
svc = SVC(kernel="rbf", cache_size=4096)
%time svc.fit(X_train_reduction, y_train)

RF(不会)