搬運來的步驟
一. 數據分析
- 下載並加載數據
- 總體預覽數據:瞭解每列數據的含義,數據的格式等
- 數據初步分析,使用統計學與繪圖: 由於特徵沒有特殊的含義,不需要過多的細緻分析
二. 特徵工程
1.根據業務,常識,以及第二步的數據分析構造特徵工程.
2.將特徵轉換爲模型可以辨別的類型(如處理缺失值,處理文本進行等)
三. 模型選擇
1.根據目標函數確定學習類型,是無監督學習還是監督學習,是分類問題還是迴歸問題等.
2.比較各個模型的分數,然後取效果較好的模型作爲基礎模型.
四. 模型融合
跳過,這個項目的重點是讓大家都瞭解這個kaggle比賽怎麼和算法更好的融合在一起。
五. 修改特徵和模型參數
此處不做過多分析,主要是優化各個算法的參數。
- KNN => k值
- SVM => 懲罰係數,核函數
- RF => 樹個數,樹深度,葉子數
- PCA => 特徵數 or 信息熵
數據分析
加載數據,劃分數據集,分離標籤
用pandas加載csv文件,MNIST數據集
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())
輸出:
<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
一下就花了半小時。。這誰頂得住。
# 感覺這個用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)
構造一個參數
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訓練:
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)
# 最優參數
grid.best_params_
# 最優分類器
knn_clf = grid.best_estimator_
SVM
這個我會了
# 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降維後的數據:
# Wall time: 9min 36s
svc = SVC(kernel="rbf", cache_size=4096)
%time svc.fit(X_train_reduction, y_train)