數(shù)據(jù)挖掘基礎(chǔ)-基本流程
建模與問題解決流程
- 1 賽題理解
- 2 數(shù)據(jù)分析(EDA)
- 3 特征工程
- 4 模型選擇
- 5 模型融合
機器學習基本算法
主要分為監(jiān)督學習、無監(jiān)督學習、半監(jiān)督學習
1.監(jiān)督學習
- Regression
linear
Polynomial - decision Tree
- random forest
- classfication
KNN
Trees
logistices
svm
naive-bayes
2.無監(jiān)督學習
- 聚類和降維
SVD
PCA
K-means - 關(guān)聯(lián)分析
Apriori
FP-growth - 隱馬爾可夫模型
1 數(shù)據(jù)分析
- 特征類型分析
- 缺失值分析
- 異常值分析
- 目標分布情況
- 特征分布情況
- 特征與目標的相關(guān)性
- 特征與特征之間的相關(guān)性
…
具體可參考我的上一篇博客EDA
2.特征工程
2.1 特征處理
-
數(shù)值型
特征縮放
歸一化
多項式
異常值
缺失值填充
數(shù)據(jù)轉(zhuǎn)換(取log等) -
類別型
One-hot 編碼 -
時間類
將其分成間隔型將其進行組合:例如某個顧客周末上淘寶的次數(shù)
將其離散化:例如周末設(shè)置為1,周內(nèi)設(shè)置為0
-
文本型
bag of words, TF-IDF
2.2特征選擇
- 1 過濾型
- 2 包裹型
- 3 嵌入型: 這里使用L1正則化,使用之后會有一部分特征的權(quán)重變?yōu)?
使用scikit-learn庫進行特征處理
3.模型選擇
3.1交叉驗證
我們根據(jù)不同的問題訓練多個模型后,該如何選擇呢?我們比較常用的方法就是進行交叉驗證,選擇泛化能力最好的模型
這里選取K折交叉驗證,將訓練集分為N份,每次選取其中的一份作為驗證集,剩下的作為訓練集。通過模型在驗證集上泛化能力的表現(xiàn)來進行選擇

3.2gridsearch:調(diào)整超參數(shù)
在我們選擇好模型之后,我們可以通過gridsearch來調(diào)整超參數(shù)

3.3模型評估
當我們的模型進行過上述操作的時候,我們?nèi)绾蝸碓u估呢,
一般模型可能會出現(xiàn)過過擬合和欠擬合兩種問題,主要導致的原因是variance 和 vias,我們通過learning curve(學習曲線)來對其進行評估

4.模型融合
1.簡單加權(quán)融合:
- 回歸(分類概率):算術(shù)平均融合,集合平均融合
- 分類(Voting)
- 綜合(排序融合),log融合
2.stacking
- 構(gòu)建多層模型,前面的模型預測結(jié)果作為輸入在進行訓練,有點類似神經(jīng)網(wǎng)絡(luò)
3.blending
- 將多個模型融合
4.bagging
- 使用boostrap的方法,得到多個不同的樣本
5.boosting
- 多樹的提升方法
下面展示使用stacking進行模型融合的效果
import warnings
warnings.filterwarnings('ignore')
import itertools
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingClassifier
from sklearn.model_selection import cross_val_score, train_test_split
from mlxtend.plotting import plot_learning_curves
from mlxtend.plotting import plot_decision_regions
# 使用iris()位置的鳶尾花數(shù)據(jù)集
iris = datasets.load_iris()
# 選取兩個特征來訓練
X, y = iris.data[:, 1:3], iris.target
# 我們訓練以下三個模型
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()
lr = LogisticRegression()
# 使用stacking融合的模型
sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],
meta_classifier=lr)
label = ['KNN', 'Random Forest', 'Naive Bayes', 'Stacking Classifier']
clf_list = [clf1, clf2, clf3, sclf]
# 模型進行可視化
fig = plt.figure(figsize=(10,8))
gs = gridspec.GridSpec(2, 2)
grid = itertools.product([0,1],repeat=2)
clf_cv_mean = []
clf_cv_std = []
for clf, label, grd in zip(clf_list, label, grid):
scores = cross_val_score(clf, X, y, cv=3, scoring='accuracy')
print("Accuracy: %.2f (+/- %.2f) [%s]" %(scores.mean(), scores.std(), label))
clf_cv_mean.append(scores.mean())
clf_cv_std.append(scores.std())
clf.fit(X, y)
ax = plt.subplot(gs[grd[0], grd[1]])
fig = plot_decision_regions(X=X, y=y, clf=clf)
plt.title(label)
plt.show()

我們發(fā)現(xiàn)stacking的accuracy最高,說明了使用模型融合的方法提高了我們模型的準確度

浙公網(wǎng)安備 33010602011771號