DAY5:Kaggle-Data Science London + Scikit-learn(二)

  • 参考大神文章

哈罗大家好,今天要用跟昨天一样的资料集,由於用PCA做降维的效果不是那麽好,於是我参考了Kaggle一位大神的文章,这边附上连结


  • 特徵工程-高斯混合GMM

接续昨天从特徵工程开始。

这边他在特徵处理的时候先采用了高斯混合聚类的方式做一个降维,它也是一种无监督学习的方式,跟Kmeans的差别在於Kmeans他是取一个中心然後去取距离,等於是划一个圆圈的概念,而在某些情况下Kmeans会无法分类出准确的群。而高斯混合他不是基於距离的模型,而是以基於分布的模型,他是假设有一定数量的高斯分布,并且以一个高斯分布代表一个群,参考说明

这里是用sklearn官方文件的范例Gaussian Mixture Model Selection去做模型的挑选。首先他先将train和test的资料合并,变成10000笔资料,40个特徵。

X = np.r_[train,test]
print(X.shape)

附上官方文件参数说明,以及最下方选择Gaussian Mixture Model Selection范例,这段code在这个范例里面

lowest_bic = np.infty

bic = []
n_components_range = range(1, 7)

cv_types = ['spherical', 'tied', 'diag', 'full']
for cv_type in cv_types:
    for n_components in n_components_range:
        gmm = GaussianMixture(n_components=n_components, covariance_type=cv_type)
        gmm.fit(X)
        bic.append(gmm.aic(X))# AIC、BIC越小越好,查看最小时n_components(分几群)为多少
        if bic[-1] < lowest_bic:
            lowest_bic = bic[-1]
            best_gmm = gmm
            
best_gmm.fit(X)

在分成4群的时候,是BIC最小,也就是我选定的最佳模型。

再来我们用最佳模型best_gmm去predict我们的train和test资料集,取出分别4个族群的概率,作为4个特徵再去丢入我们其他机器学习的模型来预测出是0或1。

gmm_train = best_gmm.predict_proba(train)
gmm_test = best_gmm.predict_proba(test)

X_train_1= pd.DataFrame(gmm_train).values
X_submit =  pd.DataFrame(gmm_test).values

後面一样用SKFold交叉验证还有GridSearchCV去找出模型的最佳参数,跟上一篇後面模型部分一样。

X_train,X_test,y_train,y_test = train_test_split(gmm_train,trainLabel,test_size=0.30, random_state=101)
print(X_train.shape,X_test.shape,y_train.shape,y_test.shape)

sk_fold = StratifiedKFold(10,shuffle=True, random_state=42)

g_nb = GaussianNB()
knn = KNeighborsClassifier()  # 参数:n_neighbors(邻居数:预设为5)、weights(权重,预设为uniform)、leaf_size(叶的大小:预设为30)
ran_for  = RandomForestClassifier() 
# n_estimators:树的颗数、max_depth:最大深度,剪枝用,超过全部剪掉。
# min_samples_leaf:搭配max_depth使用,一个节点在分枝後每个子节点都必须包含至少min_samples_leaf个训练样本
# bootstrap:重新取样原有Data产生新的Data,取样的过程是均匀且可以重复取样
log_reg = LogisticRegression() #penalty:惩罚函数(预设L2)、C:正则强度倒数,预设为1.0、solver:解决器(默认='lbfgs'),saga对所有惩罚都可以使用
tree= DecisionTreeClassifier()
xgb = XGBClassifier() # https://www.itread01.com/content/1536594984.html 参数详解

ada_boost = AdaBoostClassifier() # https://ask.hellobi.com/blog/zhangjunhong0428/12405 参数详解
grad_boost = GradientBoostingClassifier(n_estimators=100) # https://www.itread01.com/content/1514358146.html 参数详解
hist_grad_boost = HistGradientBoostingClassifier() # https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.HistGradientBoostingClassifier.html



clf = [("Naive Bayes", g_nb, {}), \
       ("K Nearest", knn, {"n_neighbors": [3, 5, 6, 7, 8, 9, 10], "leaf_size": [25, 30, 35]}), \
       ("Random Forest", ran_for,
        {"n_estimators": [10, 50, 100, 200, 400], "max_depth": [3, 10, 20, 40], "random_state": [99],
         "min_samples_leaf": [5, 10, 20, 40, 50], "bootstrap": [False]}), \
       ("Logistic Regression", log_reg, {"penalty": ['l2'], "C": [100, 10, 1.0, 0.1, 0.01], "solver": ['saga']}), \
       ("Decision Tree", tree, {}), \
       ("XGBoost", xgb,
        {"n_estimators": [200], "max_depth": [3, 4, 5], "learning_rate": [.01, .1, .2], "subsample": [.8],
         "colsample_bytree": [1], "gamma": [0, 1, 5], "lambda": [.01, .1, 1]}), \
 \
       ("Adapative Boost", ada_boost, {"n_estimators": [100], "learning_rate": [.6, .8, 1]}), \
       ("Gradient Boost", grad_boost, {}), \
 \
       ("Histogram GB", hist_grad_boost,
        {"loss": ["binary_crossentropy"], "min_samples_leaf": [5, 10, 20, 40, 50], "l2_regularization": [0, .1, 1]})]

stack_list_gmm = []
train_scores_gmm = pd.DataFrame(columns=["Name", "Train Score", "Test Score"])

i = 0
for name, clf1, param_grid in clf:

    clf = GridSearchCV(clf1, param_grid=param_grid, scoring="accuracy", cv=sk_fold, return_train_score=True)
    clf.fit(X_train, y_train)  # .reshape(-1,1)
    y_pred = clf.best_estimator_.predict(X_test)

    cm = confusion_matrix(y_test, y_pred)
    print(cm)
    print("=====================================")
    
    train_scores_gmm.loc[i]= [name,clf.best_score_,(cm[0,0]+cm[1,1,])/(cm[0,0]+cm[0,1]+cm[1,0]+cm[1,1])]
    stack_list_gmm.append(clf.best_estimator_)
    i=i+1
    
est = [("g_nb",stack_list[0]),\
       ("knn",stack_list[1]),\
       ("ran_for",stack_list[2]),\
       ("log_reg",stack_list[3]),\
       ("dec_tree",stack_list[4]),\
       ("XGBoost",stack_list[5]),\
       ("ada_boost",stack_list[6]),\
       ("grad_boost",stack_list[7]),\
       ("hist_grad_boost",stack_list[8])]

最後我一样会加上stacking再建模一次。

sc = StackingClassifier(estimators=est,final_estimator = None,cv=sk_fold,passthrough=False)
sc.fit(X_train,y_train)
y_pred = sc.predict(X_test)
cm1 = confusion_matrix(y_test,y_pred)
y_pred_train = sc.predict(X_train)
cm2 = confusion_matrix(y_train,y_pred_train)
train_scores_gmm.append(pd.Series(["Stacking",(cm2[0,0]+cm2[1,1,])/(cm2[0,0]+cm2[0,1]+cm2[1,0]+cm2[1,1]),(cm1[0,0]+cm1[1,1,])/(cm1[0,0]+cm1[0,1]+cm1[1,0]+cm1[1,1])],index=train_scores.columns),ignore_index=True)

大神果然就是大神,这个随便一个模型都比我这个废物自己用PCA好太多了,我们就选用test score最好的KNN或Logistic Regression上传看看吧。

knn.fit(train_pca_df,trainLabel)
y_submit = knn.predict(test_pca_df)
y_submit= pd.DataFrame(y_submit)
y_submit.index +=1
y_submit.columns = ['Solution']
y_submit['Id'] = np.arange(1,y_submit.shape[0]+1)
y_submit = y_submit[['Id', 'Solution']]
y_submit.to_csv('./Submission_Gauss.csv',index=False)

这分数就很高啦,达到了99.14%。


  • 今日小结

    1. 降维方法除了PCA,我们也可以尝试用聚类的非监督学习的方式来做降为,效果意外的好。
    2. 刚接触资料分析的夥伴,可以上kaggle找寻一些题目来做练习,不会也没关系,上面很多热心的大神都会愿意分享他们的code,照着做,慢慢学,有天你也会变大神的。
    3. 虽然我现在还不是大神,还有很多需要学习的部分,可能文章还有写错呢,但我相信只要慢慢学,一定会进步的。像我觉得铁人赛就是一个很好的练习管道,我很庆幸我有参加,也鼓励大家可以多写文章喔,每天记录自己所学,错了也没关系,之後学会记得把文章修改过来就好XDDD

如果有错的地方,留言告诉我,我会虚心受教的,我会继续努力!


<<:  Day 20 - 重新检视 mAP, F1, IoU, Precision-Recall 精准度

>>:  大共享时代系列_004_共享料理资讯

想抢先经营网路行销,必需先了解5件事

在辅导企业高层主管上课时候,我常跟他们说如果不了解你的产品市场那麽就无法开始执行方案,因此在这个後疫...

Day19-Component

学习React过程中很重要的概念为组件化。 何谓组件化??? 重复使用 切割成更细小的碎片,达到耦合...

寻找字串与她的小夥伴:正规式 String Regex Replace

「学姐,这麽多的函式你都能背起来吗?」诗忆强撑着困倦的眼皮。 「如果人脑这麽厉害,就不用电脑了呢,而...

DAY22 这边先帮你上一个按钮喔~(四)

「欸!?阿按了这个按钮怎麽没反应阿?」 这是我妈最常问我的问题,大部分情况都是她遥控器忘记装电池。 ...

Day 28:合并排序法 Merge Sort

Merge Sort采用Divide and Conquer的方式,其实他的概念本身就是递回(rec...