
來(lái)源:數(shù)據(jù)STUDIO
作者:云朵君
導(dǎo)讀:大家好,我是云朵君!自從分享了一篇能夠?qū)懺诤?jiǎn)歷里的企業(yè)級(jí)數(shù)據(jù)挖掘實(shí)戰(zhàn)項(xiàng)目,深受讀者朋友們青睞,許多讀者私信云朵君,希望多一些類(lèi)似的數(shù)據(jù)挖掘實(shí)際案例。這就來(lái)了。
本項(xiàng)目旨在探討影響學(xué)生學(xué)業(yè)表現(xiàn)的人口統(tǒng)計(jì)學(xué)和家庭特征。本項(xiàng)目中,使用多種不平衡數(shù)據(jù)處理方法以及各種分類(lèi)器,如決策樹(shù),邏輯回歸,k近鄰,隨機(jī)森林和多層感知器的分類(lèi)機(jī)器。
本案例數(shù)據(jù)集來(lái)自Balochistan的6000名學(xué)生。其基本情況:一共13個(gè)字段,其中RESULT為結(jié)果標(biāo)簽;語(yǔ)言字段是經(jīng)過(guò)獨(dú)熱編碼后的四個(gè)字段,分別為L(zhǎng)ang1, Lang2, Lang3, Lang4;
另外性別、學(xué)校、是否殘疾、宗教信仰四個(gè)字段為二分類(lèi)離散字段;
其余如兄弟姐妹、在校兄弟姐妹數(shù)量為連續(xù)性變量。
本次數(shù)據(jù)為清洗過(guò)后"干凈"數(shù)據(jù),可以直接輸入到機(jī)器學(xué)習(xí)模型中直接建模使用。
探索性數(shù)據(jù)分析有多種方法,這里直接通過(guò)繪制柱狀圖查看每個(gè)字段的分布狀況。
從數(shù)據(jù)集特點(diǎn)來(lái)看,13個(gè)字段可以分為四大類(lèi)。
考試結(jié)果為PASS的共有4562名學(xué)生,而結(jié)果為FAIL的共有1047名學(xué)生,從下圖中也可以明顯看出,該樣本為不平衡數(shù)據(jù)集,因此本次案例重點(diǎn)在于不平衡數(shù)據(jù)分類(lèi)方法。
性別有男女,學(xué)校有學(xué)校1和學(xué)校2,身體健康狀況有是否殘疾,宗教信仰分是否是穆斯林。
本次數(shù)據(jù)集中兄弟姐妹數(shù)量及在校兄弟姐妹數(shù)量分布情況可以由下面四張分布圖很好地展示出來(lái)。
啞變量
本次數(shù)據(jù)集共有四種語(yǔ)言,其數(shù)量分布由下圖所示。接近一半的學(xué)生都是說(shuō)的一種語(yǔ)言(Lang1)。
從上一步的探索性數(shù)據(jù)分析結(jié)果,本次學(xué)生成績(jī)數(shù)據(jù)集為不平衡數(shù)據(jù)集,那么處理不平衡數(shù)據(jù)集處理方法都有哪些呢。
在本文云朵君從三個(gè)方面總結(jié)了多種處理方法,見(jiàn)下面思維導(dǎo)圖。
這里主要介紹下數(shù)據(jù)預(yù)處理層面的數(shù)據(jù)重采樣方法。數(shù)據(jù)重采樣主要分為上采樣和下采樣。
下采樣,也稱(chēng)為欠采樣(Under-Sampling),是一個(gè)為平衡數(shù)據(jù)類(lèi)分布的移除大類(lèi)數(shù)據(jù)的非啟發(fā)式的方法。此方法的底層邏輯是平衡數(shù)據(jù)集進(jìn)而克服算法的特異性。
常用的方法有隨機(jī)欠采樣(Random Under-Sampling, RUS),即隨機(jī)排除大類(lèi)的觀(guān)察值,和聚焦欠采樣(Focused Under-Sampling, FUS), 即移除兩類(lèi)邊界處的大類(lèi)數(shù)據(jù)。
上采樣,也稱(chēng)為過(guò)采樣(Over-Samplig),是通過(guò)復(fù)制小類(lèi)觀(guān)察值,從而增加小類(lèi)比例的一個(gè)方法。類(lèi)似的,過(guò)采樣也有隨機(jī)過(guò)采樣和聚焦過(guò)采樣兩種方法。
來(lái)源:kaggle
過(guò)采樣代表SMOTE方法,其主要概念也就是在少數(shù)樣本位置近的地方,人工合成一些樣本,整個(gè)算法的流程如下:
相對(duì)于過(guò)采樣,欠采樣是將多數(shù)樣本按比例減少,使得模型的加權(quán)權(quán)重改變,少考慮一些多數(shù)樣本,上圖很好地展示了兩種方法的差異 。
Tomek Link 算法
會(huì)針對(duì)所有樣本去遍歷一次,如有兩個(gè)樣本點(diǎn)x, y分屬不同的class,即一個(gè)為多數(shù)樣本而另一個(gè)為少數(shù)樣本,則可以去計(jì)算它們之間的距離d(x , y) 。
此時(shí)如果找不到第三個(gè)樣本點(diǎn)z,使得任一樣本點(diǎn)到z 的距離比樣本點(diǎn)之間的距離還小,則稱(chēng)為T(mén)omek Link,一張圖幫助理解 :
來(lái)源:Kaggle
Tomek Link 的關(guān)鍵思路在于,找出邊界那些鑒別度不高的樣本,認(rèn)為這些樣本點(diǎn)屬于雜訊,應(yīng)該剔除,因此可以見(jiàn)上圖最右邊,剔除以后兩種類(lèi)別的樣本點(diǎn)可以更好地區(qū)分開(kāi)來(lái)。
ENN算法(Edited Nearest Neighbor)
與上面Tomek Links的觀(guān)念相同,ENN算法也是透過(guò)某種方式來(lái)剔除鑒別度低的樣本,只是這邊的方式改成了對(duì)多數(shù)類(lèi)的樣本尋找K個(gè)近鄰點(diǎn),如果有一半以上(當(dāng)然,門(mén)檻可以自己設(shè)定)都不屬于多數(shù)樣本,就將該樣本剔除,通常這些樣本也會(huì)出現(xiàn)在少數(shù)樣本之中。
SMOTE + ENN、SMOTE + Tomek Links算法都是結(jié)合過(guò)采樣與欠采樣算法SMOTEENN使用 SMOTE 進(jìn)行過(guò)采樣,然后使用 Edited Nearest Neighbours 進(jìn)行欠采樣。
SMOTETomek使用 SMOTE 進(jìn)行過(guò)采樣,然后使用 Tomek Links 進(jìn)行欠采樣。
控制變量法選擇合適的處理方法。選用決策樹(shù)為基分類(lèi)器,并分別選擇不使用數(shù)據(jù)重采樣,使用SMOTE、SMOTEENN和SMOTETomek共三種數(shù)據(jù)重采樣方法,比較這四種情況下的模型評(píng)價(jià)指標(biāo)AUC得分情況。
最后分別選用五種不同分類(lèi)器,且分別采用不同的數(shù)據(jù)重采樣方法,繪制ROC曲線(xiàn)及得到的AUC得分情況。
ROC曲線(xiàn)繪制采用不同分類(lèi)閾值的TPR和FPR,降低分類(lèi)閾值會(huì)將更多的樣本判為正類(lèi)別,從而增加FP和TP的個(gè)數(shù)。為了繪制ROC曲線(xiàn),需要使用不同的分類(lèi)閾值多次評(píng)估回歸模型,很麻煩。有一種基于排序的高效算法可以為我們提供此類(lèi)信息,這種算法稱(chēng)為曲線(xiàn)下的面積(AUV,area under roc curve)。
ROC曲線(xiàn)的橫軸為FPR,越低越好,縱軸為T(mén)PR,越高越好,故如果有兩個(gè)不同的模型,曲線(xiàn)位于左上方的模型優(yōu)于曲線(xiàn)位于右下方的模型,這一點(diǎn)可以拿曲線(xiàn)的面積(AUV)來(lái)量化。
完美的分類(lèi)為T(mén)PR=1,F(xiàn)PR=0;ROC曲線(xiàn)過(guò)(0,0)和(1,1)點(diǎn)
AUC計(jì)算的物理意義為:任取一對(duì)(正、負(fù))樣本,正樣本的score大于負(fù)樣本的score的概率,也即是隨機(jī)正類(lèi)別樣本位于隨機(jī)負(fù)類(lèi)別樣本右側(cè)的概率。
將所有主要方法定義為函數(shù),包括數(shù)據(jù)重采樣、劃分測(cè)試集和訓(xùn)練集、模型訓(xùn)練、模型評(píng)價(jià)和結(jié)果可視化。
此外,由于是比較不平衡數(shù)據(jù)集處理方法選擇的優(yōu)劣,這里所有的機(jī)器學(xué)習(xí)模型都采用默認(rèn)參數(shù)。
def reSampler(X, y, samp):"""不同的數(shù)據(jù)重采樣策略"""if(samp == 'None'):return splitter(X, y, 0.1)if(samp == 'SMOTE'):sm = SMOTE('auto', 42)X_resampled , y_resampled = sm.fit_resample(X, Y)return splitter(X_resampled , y_resampled, 0.1)if(samp == 'SMOTEENN'):sm = SMOTEENN()X_resampled , y_resampled = sm.fit_resample(X, Y)return splitter(X_resampled , y_resampled, 0.1)if(samp == 'SMOTETomek'):sm = SMOTEENN()X_resampled , y_resampled = sm.fit_resample(X, Y)return splitter(X_resampled , y_resampled, 0.1)def splitter(X, y, test_Size):"""劃分測(cè)試集和訓(xùn)練集"""xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size = test_Size, random_state=12)return xtrain, xtest, ytrain, ytestdef rocPlotter(actu, pred, clf, samp):"""AUC曲線(xiàn)繪圖函數(shù)"""false_positive_rate, true_positive_rate, thresholds = roc_curve(actu, pred)roc_auc = auc(false_positive_rate, true_positive_rate)Title = str('ROC: ' + str(clf) + ' using ' + str(samp))plt.title(Title)plt.plot(false_positive_rate, true_positive_rate, 'b',label='AUC = %0.2f'% roc_auc)plt.legend(loc='lower right')plt.plot([0,1],[0,1],'r--')plt.xlim([-0.1,1.2])plt.ylim([-0.1,1.2])plt.ylabel('True Positive Rate')plt.xlabel('False Positive Rate')plt.show()return roc_aucdef applyModel(clfr, X_, y_, xt, yt):"""使用模型"""a = globals()[clfr]()a.fit(X_, y_)scor = a.score(xt, yt)*100pred = a.predict(xt)actu = ytreturn pred, actu, scordef tryAll(clfList, sampList, Inputs, Outputs):"""主函數(shù)"""rep = np.zeros( (len(clfList), len(sampList)), dtype=float)for clf, clfIndex in zip(clfList, range(len(clfList))):# 不同的分類(lèi)器for samp, sampIndex in zip(sampList, range(len(sampList))):# 不同的重采樣策略X_train, X_test, Y_train, Y_test = reSampler(Inputs, Outputs, samp)prediction , actual, score =applyModel(clf, X_train, Y_train, X_test, Y_test)currentAUC = rocPlotter(prediction, actual, clf, samp)print(clf, ' with ', samp, ' scored = ', score,' on test set with AUC = ', currentAUC)rep[clfIndex, sampIndex] = currentAUCreturn rep
Classifiers = ['DecisionTreeClassifier', 'KNeighborsClassifier','LogisticRegression', 'MLPClassifier','RandomForestClassifier']Samplers = ['None', 'SMOTE', 'SMOTETomek', 'SMOTEENN']report = tryAll(Classifiers, Samplers, X, Y)
下面以單個(gè)模型四種不同重采樣策略,和五種模型單個(gè)重采樣策略為例展示可視化結(jié)果。大家可以運(yùn)行上述代碼以得到完整的結(jié)果展示。
決策樹(shù)模型在四種不同重采樣策略下,得到的四種不同的結(jié)果。很明顯地看到?jīng)]有使用數(shù)據(jù)重采樣的模型得分最差只有0.54,而使用混合采樣算法的兩個(gè)結(jié)果的得分都比較理想,分別是0.973275和0.979196分。
接下來(lái)以上述結(jié)果中得分最高的混合采樣算法SMOTETomek為例,將不平衡數(shù)據(jù)集經(jīng)過(guò)SMOTETomek算法處理后,分別用
DecisionTreeClassifier決策樹(shù)分類(lèi)器,KNeighborsClassifierK近鄰分類(lèi)器,LogisticRegression邏輯回歸,MLPClassifier多層感知機(jī),RandomForestClassifier隨機(jī)森林分類(lèi)器五種機(jī)器學(xué)習(xí)模型訓(xùn)練和測(cè)試數(shù)據(jù),并得到如下結(jié)果。
從結(jié)果可知道,并不是所有模型在使用混合采樣算法SMOTETomek后都能達(dá)到令人滿(mǎn)意的效果。
為方便查看所有結(jié)果,將所模型、所有重采樣方法匯總到如下圖所示的DataFrame中。從AUC結(jié)果看,使用混合采樣算法SMOTEENN對(duì)數(shù)據(jù)集處理,并使用決策樹(shù)模型對(duì)結(jié)果進(jìn)行預(yù)測(cè),將會(huì)得到最佳預(yù)測(cè)效果。其AUC=0.979。
pd.DataFrame(report, columns = Samplers, index = Classifiers)
上節(jié)中選用五種不同分類(lèi)器,三種不同的數(shù)據(jù)重采樣方法,結(jié)合ROC曲線(xiàn)及AUC得分情況來(lái)確定重采樣方法對(duì)選擇。
本節(jié)可以理解為是上節(jié)的拓展。
# 實(shí)例化五種分類(lèi)器模型dTree = DecisionTreeClassifier()logReg = LogisticRegression()knn = KNeighborsClassifier(n_neighbors=5)rF = RandomForestClassifier()MLP = MLPClassifier()# 實(shí)例化十種數(shù)據(jù)重采樣模型rmun = RandomUnderSampler()cnn = CondensedNearestNeighbour()nm = NearMiss()enn = EditedNearestNeighbours()renn =
RepeatedEditedNearestNeighbours()tkLink = TomekLinks()rmov = RandomOverSampler()sm = SMOTE()sm_en = SMOTEENN()sm_tk = SMOTETomek()# 以SMOTEENN采樣方法為例sm_en = SMOTEENN()X_resampled, Y_resampled = sm_en.fit_resample(X, Y)# 分別使用10折交叉驗(yàn)證的方法得到平均得分scores_dTree = cross_val_score(dTree, X_resampled, Y_resampled, cv = 10, scoring='roc_auc')scores_dTree = scores_dTree.mean()# 打印出每次的結(jié)果print('After appling SMOTENN: ')print(' dTree, logReg , KNN , rF , MLP')print(scores_dTree, scores_logReg, scores_knn, scores_rF, scores_MLP)
將所有結(jié)果存儲(chǔ)在一個(gè)DataFrame里
Classifiers = ['DecisionTreeClassifier', 'LogisticRegression','KNeighborsClassifier', 'RandomForestClassifier','MLPClassifier']Samplers = ['None','Random Undersampling', 'CNN', 'NearMiss','ENN', 'RENN','Tomek Links','SMOTE','Random Oversampling', 'SMOTEENN','SMOTETomek']pd.DataFrame(report, columns = Samplers, index = Classifiers)
并用熱圖可視化更加直觀(guān)地展示出結(jié)果來(lái)
import seaborn as snsplt.figure()ax = sns.heatmap(report,xticklabels=Samplers,yticklabels=Classifiers,annot = True, vmin=0,vmax=1, linewidth=0.1,cmap="YlGnBu",)
從熱圖的特性可以看出,藍(lán)色越深,模型效果越好。本案例中可以得到如下幾個(gè)結(jié)論
本例采用的來(lái)自Balochistan的6000名學(xué)生不平衡數(shù)據(jù)集。本項(xiàng)目旨在探討影響學(xué)生學(xué)業(yè)表現(xiàn)的人口統(tǒng)計(jì)學(xué)和家庭特征。
本例使用清洗后的數(shù)據(jù)集,以探索數(shù)據(jù)變量的分布特征開(kāi)篇,重點(diǎn)介紹了數(shù)據(jù)不平衡處理的各種方法,以及演示如何通過(guò)交叉驗(yàn)證方法選擇合適的數(shù)據(jù)不平衡處理以及選擇合適的機(jī)器學(xué)習(xí)分類(lèi)模型。
本文后續(xù)工作可以是通過(guò)正文中得到的結(jié)果,選擇幾個(gè)合適的模型,通過(guò)適當(dāng)?shù)哪P驼{(diào)參方法選擇恰當(dāng)?shù)膮?shù),以確定本次數(shù)據(jù)挖掘的最終模型。
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢(xún)效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開(kāi)的話(huà)題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類(lèi)型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專(zhuān)業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專(zhuān)業(yè)操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶(hù)體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷(xiāo)案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷(xiāo)成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類(lèi)分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類(lèi)分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10