国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

教你用Python解決非平衡數(shù)據(jù)問題(附代碼)

開發(fā) 后端 大數(shù)據(jù)
本次分享的主題是關(guān)于數(shù)據(jù)挖掘中常見的非平衡數(shù)據(jù)的處理,內(nèi)容涉及到非平衡數(shù)據(jù)的解決方案和原理,以及如何使用Python這個強大的工具實現(xiàn)平衡的轉(zhuǎn)換。

前言

好久沒有更新自己寫的文章了,相信很多讀者都會比較失望,甚至取關(guān)了吧,在此向各位網(wǎng)友道個歉。文章未及時更新的主要原因是目前在寫Python和R語言相關(guān)的書籍,激動的是基于Python的數(shù)據(jù)分析與挖掘的書已經(jīng)編寫完畢,后期還繼續(xù)書寫R語言相關(guān)的內(nèi)容。希望得到網(wǎng)友的理解,為晚來的新文章再次表示抱歉。

本次分享的主題是關(guān)于數(shù)據(jù)挖掘中常見的非平衡數(shù)據(jù)的處理,內(nèi)容涉及到非平衡數(shù)據(jù)的解決方案和原理,以及如何使用Python這個強大的工具實現(xiàn)平衡的轉(zhuǎn)換。

SMOTE算法的介紹

在實際應(yīng)用中,讀者可能會碰到一種比較頭疼的問題,那就是分類問題中類別型的因變量可能存在嚴重的偏倚,即類別之間的比例嚴重失調(diào)。如欺詐問題中,欺詐類觀測在樣本集中畢竟占少數(shù);客戶流失問題中,非忠實的客戶往往也是占很少一部分;在某營銷活動的響應(yīng)問題中,真正參與活動的客戶也同樣只是少部分。

如果數(shù)據(jù)存在嚴重的不平衡,預測得出的結(jié)論往往也是有偏的,即分類結(jié)果會偏向于較多觀測的類。對于這種問題該如何處理呢?最簡單粗暴的辦法就是構(gòu)造1:1的數(shù)據(jù),要么將多的那一類砍掉一部分(即欠采樣),要么將少的那一類進行Bootstrap抽樣(即過采樣)。但這樣做會存在問題,對于***種方法,砍掉的數(shù)據(jù)會導致某些隱含信息的丟失;而第二種方法中,有放回的抽樣形成的簡單復制,又會使模型產(chǎn)生過擬合。

為了解決數(shù)據(jù)的非平衡問題,2002年Chawla提出了SMOTE算法,即合成少數(shù)過采樣技術(shù),它是基于隨機過采樣算法的一種改進方案。該技術(shù)是目前處理非平衡數(shù)據(jù)的常用手段,并受到學術(shù)界和工業(yè)界的一致認同,接下來簡單描述一下該算法的理論思想。

SMOTE算法的基本思想就是對少數(shù)類別樣本進行分析和模擬,并將人工模擬的新樣本添加到數(shù)據(jù)集中,進而使原始數(shù)據(jù)中的類別不再嚴重失衡。該算法的模擬過程采用了KNN技術(shù),模擬生成新樣本的步驟如下:

  • 采樣最鄰近算法,計算出每個少數(shù)類樣本的K個近鄰;
  • 從K個近鄰中隨機挑選N個樣本進行隨機線性插值;
  • 構(gòu)造新的少數(shù)類樣本;
  • 將新樣本與原數(shù)據(jù)合成,產(chǎn)生新的訓練集;

為了使讀者理解SMOTE算法實現(xiàn)新樣本的模擬過程,可以參考下圖和人工新樣本的生成過程:

 

如上圖所示,實心圓點代表的樣本數(shù)量要明顯多于五角星代表的樣本點,如果使用SMOTE算法模擬增加少類別的樣本點,則需要經(jīng)過如下幾個步驟:

  • 利用KNN算法,選擇離樣本點x1最近的K個同類樣本點(不妨最近鄰為5);
  • 從最近的K個同類樣本點中,隨機挑選M個樣本點(不妨M為2),M的選擇依賴于最終所希望的平衡率;
  • 對于每一個隨機選中的樣本點,構(gòu)造新的樣本點;新樣本點的構(gòu)造需要使用下方的公式:

 

其中,xi表示少數(shù)類別中的一個樣本點(如圖中五角星所代表的x1樣本);xj表示從K近鄰中隨機挑選的樣本點j;rand(0,1)表示生成0~1之間的隨機數(shù)。

假設(shè)圖中樣本點x1的觀測值為(2,3,10,7),從圖中的5個近鄰中隨機挑選2個樣本點,它們的觀測值分別為(1,1,5,8)和(2,1,7,6),所以,由此得到的兩個新樣本點為:

 

  • 重復步驟1)、2)和3),通過迭代少數(shù)類別中的每一個樣本xi,最終將原始的少數(shù)類別樣本量擴大為理想的比例;

通過SMOTE算法實現(xiàn)過采樣的技術(shù)并不是太難,讀者可以根據(jù)上面的步驟自定義一個抽樣函數(shù)。當然,讀者也可以借助于imblearn模塊,并利用其子模塊over_sampling中的SMOTE“類”實現(xiàn)新樣本的生成。有關(guān)該“類”的語法和參數(shù)含義如下:

 

  1. SMOTE(ratio=’auto’, random_state=None, k_neighbors=5, m_neighbors=10, 
  2.      out_step=0.5, kind=’regular’, svm_estimator=None, n_jobs=1) 
  • ratio:用于指定重抽樣的比例,如果指定字符型的值,可以是’minority’,表示對少數(shù)類別的樣本進行抽樣、’majority’,表示對多數(shù)類別的樣本進行抽樣、’not minority’表示采用欠采樣方法、’all’表示采用過采樣方法,默認為’auto’,等同于’all’和’not minority’;如果指定字典型的值,其中鍵為各個類別標簽,值為類別下的樣本量;
  • random_state:用于指定隨機數(shù)生成器的種子,默認為None,表示使用默認的隨機數(shù)生成器;
  • k_neighbors:指定近鄰個數(shù),默認為5個;
  • m_neighbors:指定從近鄰樣本中隨機挑選的樣本個數(shù),默認為10個;
  • kind:用于指定SMOTE算法在生成新樣本時所使用的選項,默認為’regular’,表示對少數(shù)類別的樣本進行隨機采樣,也可以是’borderline1’、’borderline2’和’svm’;
  • svm_estimator:用于指定SVM分類器,默認為sklearn.svm.SVC,該參數(shù)的目的是利用支持向量機分類器生成支持向量,然后再生成新的少數(shù)類別的樣本;
  • n_jobs:用于指定SMOTE算法在過采樣時所需的CPU數(shù)量,默認為1表示僅使用1個CPU運行算法,即不使用并行運算功能;

分類算法的應(yīng)用實戰(zhàn)

本次分享的數(shù)據(jù)集來源于德國某電信行業(yè)的客戶歷史交易數(shù)據(jù),該數(shù)據(jù)集一共包含條4,681記錄,19個變量,其中因變量churn為二元變量,yes表示客戶流失,no表示客戶未流失;剩余的自變量包含客戶的是否訂購國際長途套餐、語音套餐、短信條數(shù)、話費、通話次數(shù)等。接下來就利用該數(shù)據(jù)集,探究非平衡數(shù)據(jù)轉(zhuǎn)平衡后的效果。

 

  1. # 導入第三方包 
  2. import pandas as pd 
  3. import numpy as np 
  4. import matplotlib.pyplot as plt 
  5. from sklearn import model_selection 
  6. from sklearn import tree 
  7. from sklearn import metrics 
  8. from imblearn.over_sampling import SMOTE 
  9. # 讀取數(shù)據(jù)churn = pd.read_excel(r'C:\Users\Administrator\Desktop\Customer_Churn.xlsx'
  10. churn.head() 

 

  1. # 中文亂碼的處理 
  2. plt.rcParams['font.sans-serif']=['Microsoft YaHei'
  3.  
  4. # 為確保繪制的餅圖為圓形,需執(zhí)行如下代碼 
  5. plt.axes(aspect = 'equal'
  6. # 統(tǒng)計交易是否為欺詐的頻數(shù) 
  7. counts = churn.churn.value_counts() 
  8.  
  9. # 繪制餅圖 
  10. plt.pie(x = counts, # 繪圖數(shù)據(jù) 
  11.         labels=pd.Series(counts.index).map({'yes':'流失','no':'未流失'}), # 添加文字標簽 
  12.         autopct='%.2f%%' # 設(shè)置百分比的格式,這里保留一位小數(shù) 
  13.        ) 
  14. # 顯示圖形 
  15. plt.show() 

 

如上圖所示,流失用戶僅占到8.3%,相比于未流失用戶,還是存在比較大的差異的??梢哉J為兩種類別的客戶是失衡的,如果直接對這樣的數(shù)據(jù)建模,可能會導致模型的結(jié)果不夠準確。不妨先對該數(shù)據(jù)構(gòu)建隨機森林模型,看看是否存在偏倚的現(xiàn)象。

原始數(shù)據(jù)表中的state變量和Area_code變量表示用戶所屬的“州”和地區(qū)編碼,直觀上可能不是影響用戶是否流失的重要原因,故將這兩個變量從表中刪除。除此,用戶是否訂購國際長途業(yè)務(wù)international_plan和語音業(yè)務(wù)voice_mail_plan,屬于字符型的二元值,它們是不能直接代入模型的,故需要轉(zhuǎn)換為0-1二元值。

 

  1. # 數(shù)據(jù)清洗 
  2. # 刪除state變量和area_code變量 
  3. churn.drop(labels=['state','area_code'], axis = 1, inplace = True
  4.  
  5. # 將二元變量international_plan和voice_mail_plan轉(zhuǎn)換為0-1啞變量 
  6. churn.international_plan = churn.international_plan.map({'no':0,'yes':1}) 
  7. churn.voice_mail_plan = churn.voice_mail_plan.map({'no':0,'yes':1}) 
  8. churn.head() 

 

如上表所示,即為清洗后的干凈數(shù)據(jù),接下來對該數(shù)據(jù)集進行拆分,分別構(gòu)建訓練數(shù)據(jù)集和測試數(shù)據(jù)集,并利用訓練數(shù)據(jù)集構(gòu)建分類器,測試數(shù)據(jù)集檢驗分類器:

 

  1. # 用于建模的所有自變量 
  2. predictors = churn.columns[:-1] 
  3. # 數(shù)據(jù)拆分為訓練集和測試集 
  4. X_train,X_test,y_train,y_test = model_selection.train_test_split(churn[predictors], churn.churn, random_state=12) 
  5.  
  6. # 構(gòu)建決策樹 
  7. dt = tree.DecisionTreeClassifier(n_estimators = 300) 
  8. dt.fit(X_train,y_train) 
  9. # 模型在測試集上的預測 
  10. pred = dt.predict(X_test) 
  11.  
  12. # 模型的預測準確率 
  13. print(metrics.accuracy_score(y_test, pred)) 
  14. # 模型評估報告 
  15. print(metrics.classification_report(y_test, pred)) 

 

如上結(jié)果所示,決策樹的預測準確率超過93%,其中預測為no的覆蓋率recall為97%,但是預測為yes的覆蓋率recall卻為62%,兩者相差甚遠,說明分類器確實偏向了樣本量多的類別(no)。

 

  1. # 繪制ROC曲線 
  2. # 計算流失用戶的概率值,用于生成ROC曲線的數(shù)據(jù) 
  3. y_score = dt.predict_proba(X_test)[:,1] 
  4. fpr,tpr,threshold = metrics.roc_curve(y_test.map({'no':0,'yes':1}), y_score) 
  5.  
  6. # 計算AUC的值 
  7. roc_auc = metrics.auc(fpr,tpr) 
  8. # 繪制面積圖 
  9. plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black'
  10. # 添加邊際線 
  11. plt.plot(fpr, tpr, color='black', lw = 1) 
  12. # 添加對角線 
  13. plt.plot([0,1],[0,1], color = 'red', linestyle = '--'
  14. # 添加文本信息 
  15. plt.text(0.5,0.3,'ROC curve (area = %0.3f)' % roc_auc) 
  16. # 添加x軸與y軸標簽 
  17. plt.xlabel('1-Specificity'
  18. plt.ylabel('Sensitivity'
  19. # 顯示圖形 
  20. plt.show() 

 

如上圖所示,ROC曲線下的面積為0.79***UC的值小于0.8,故認為模型不太合理。(通常拿AUC與0.8比較,如果大于0.8,則認為模型合理)。接下來,利用SMOTE算法對數(shù)據(jù)進行處理:

 

  1. # 對訓練數(shù)據(jù)集作平衡處理 
  2. over_samples = SMOTE(random_state=1234)  
  3. over_samples_X,over_samples_y = over_samples.fit_sample(X_train, y_train) 
  4.  
  5. # 重抽樣前的類別比例 
  6. print(y_train.value_counts()/len(y_train)) 
  7. # 重抽樣后的類別比例 
  8. print(pd.Series(over_samples_y).value_counts()/len(over_samples_y)) 

 

如上結(jié)果所示,對于訓練數(shù)據(jù)集本身,它的類別比例還是存在較大差異的,但經(jīng)過SMOTE算法處理后,兩個類別就可以達到1:1的平衡狀態(tài)。下面就可以利用這個平衡數(shù)據(jù),重新構(gòu)建決策樹分類器了:

 

  1. # 基于平衡數(shù)據(jù)重新構(gòu)建決策樹模型 
  2. dt2 = ensemble.DecisionTreeClassifier(n_estimators = 300) 
  3. dt2.fit(over_samples_X,over_samples_y) 
  4. # 模型在測試集上的預測 
  5. pred2 =dt2.predict(np.array(X_test)) 
  6.  
  7. # 模型的預測準確率 
  8. print(metrics.accuracy_score(y_test, pred2)) 
  9. # 模型評估報告 
  10. print(metrics.classification_report(y_test, pred2)) 

 

如上結(jié)果所示,利用平衡數(shù)據(jù)重新建模后,模型的準確率同樣很高,為92.6%(相比于原始非平衡數(shù)據(jù)構(gòu)建的模型,準確率僅下降1%),但是預測為yes的覆蓋率提高了10%,達到72%,這就是平衡帶來的好處。

 

  1. # 計算流失用戶的概率值,用于生成ROC曲線的數(shù)據(jù) 
  2. y_score = rf2.predict_proba(np.array(X_test))[:,1] 
  3. fpr,tpr,threshold = metrics.roc_curve(y_test.map({'no':0,'yes':1}), y_score) 
  4. # 計算AUC的值 
  5. roc_auc = metrics.auc(fpr,tpr) 
  6. # 繪制面積圖 
  7. plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black'
  8. # 添加邊際線 
  9. plt.plot(fpr, tpr, color='black', lw = 1) 
  10. # 添加對角線 
  11. plt.plot([0,1],[0,1], color = 'red', linestyle = '--'
  12. # 添加文本信息 
  13. plt.text(0.5,0.3,'ROC curve (area = %0.3f)' % roc_auc) 
  14. # 添加x軸與y軸標簽 
  15. plt.xlabel('1-Specificity'
  16. plt.ylabel('Sensitivity'
  17.  
  18. # 顯示圖形 
  19. plt.show() 

 

最終得到的AUC值為0.836,此時就可以認為模型相對比較合理了。

責任編輯:未麗燕 來源: 數(shù)據(jù)分析1480
相關(guān)推薦

2022-10-19 08:00:00

2023-10-27 11:38:09

PythonWord

2018-06-23 07:38:10

2018-12-10 10:00:06

Python神經(jīng)網(wǎng)絡(luò)編程語言

2019-01-24 09:00:00

PythonAutoML機器學習

2021-05-18 14:42:55

PythonMySQL

2018-03-09 10:37:48

詩歌代碼寫詩

2015-04-22 11:29:45

PythonPython創(chuàng)建瀑布圖

2015-03-23 12:33:28

2023-08-03 08:51:07

2019-10-17 21:37:28

微信飛機大戰(zhàn)Python

2018-03-16 10:52:02

2021-05-10 06:48:11

Python騰訊招聘

2021-12-26 18:32:26

Python Heic 文件

2020-04-09 09:52:42

Python數(shù)據(jù)技術(shù)

2021-08-09 13:31:25

PythonExcel代碼

2022-05-25 08:21:15

2014-07-22 10:19:19

NeoBundle

2017-06-23 19:08:23

大數(shù)據(jù)PyTorch自然語言

2017-07-19 10:22:07

點贊
收藏

51CTO技術(shù)棧公眾號

国模一区二区三区私拍视频| 2022国产精品视频| 久久婷婷影院| 亚洲xxxx做受欧美| 亚洲国产成人精品女人| 欧美高清一级片在线观看| 性欧美xxxx免费岛国不卡电影| 九色精品免费永久在线| av女在线播放| 三区四区电影在线观看| 国产在线精品国自产拍免费| 成人欧美一区二区三区小说| 视频一区国产精品| 国产精品毛片| 俄罗斯av网站| 蜜臀av性久久久久蜜臀av麻豆| 91麻豆精品国产自产在线| 欧美一二三四区在线| 成人女保姆的销魂服务| 日韩一区免费| av色综合久久天堂av综合| 男女羞羞电影免费观看| 久久中文亚洲字幕| 国产亚洲精品久久久久婷婷瑜伽| 亚洲字幕一区二区| a优女a优女片| 久久日韩粉嫩一区二区三区| 日本不卡免费新一二三区| 日本一区二区三区在线观看视频| 国产校园另类小说区| 91久久奴性调教| 男男互摸gay网站| 最新国产精品久久精品| 国产国产国产国产国产国产| 国产精品久久久久影院| 狠狠操夜夜操| 精品欧美激情精品一区| 欧美久久久久久久| 日本va欧美va精品| 国模视频一区二区| 98视频精品全部国产| 色婷婷综合久久| 1769在线观看| 一本大道熟女人妻中文字幕在线 | 国产精品久久久久久久久久久久久久久 | 亚洲精品一二区| 亚洲成人va| 色综合久久久久网| 一区二区高清不卡| 日韩电影第一页| 51精品国产| 91精品国产一区二区三区动漫| 亚洲专区免费| 青草青青在线视频| 亚洲综合在线观看视频| 天天综合视频在线观看| 亚洲美女又黄又爽在线观看| 桃乃木香奈av在线| 91精品国产aⅴ一区二区| www.youjizz.com在线| 久久综合伊人77777蜜臀| 久久国产影院| 亚洲最新在线| 欧美日韩亚洲国产精品| 97精品免费视频| 欧美69视频| 久久全国免费视频| 亚洲黄色大片| 黑森林福利视频导航| 日本电影亚洲天堂一区| 香蕉成人影院| 成人午夜在线观看| 成人污污视频在线观看| 青青影院一区二区三区四区| 99国产精品久久| www.亚洲视频| 久久久久久久久久亚洲| 老牛影视一区二区三区| 成年人羞羞的网站| 欧美国产精品久久| 深夜国产在线播放| 国产精品久久久久91| 狠狠色丁香婷综合久久| 欧美色图亚洲自拍| 久久精品欧美一区二区三区麻豆| 秋霞成人影院| 国产精品99久久久久久人| 国产精选久久| 久久国产精品久久精品国产| 亚洲国产精品成人| 欧美人成在线观看| 美女诱惑一区二区| 在线看片你懂得| 亚洲第一综合色| 久久福利在线| 日本黄网免费一区二区精品| 亚洲成av人在线观看| 亚洲综合资源| av不卡在线免费观看| 极品销魂美女一区二区三区| 日韩专区一区二区| 欧美性受xxx| 欧洲杯足球赛直播| 国产96在线 | 亚洲| 欧美成人精品3d动漫h| 麻豆传媒免费在线观看| 日本不卡视频在线播放| 91亚洲午夜精品久久久久久| 2021天堂中文幕一二区在线观| 成人欧美一区二区三区黑人免费| 亚洲麻豆国产自偷在线| 人人超碰在线| 性欧美xxxx| 久久综合丝袜日本网| 亚洲1234区| 天天操天天干天天玩| 精品日产卡一卡二卡麻豆| 免费涩涩18网站入口| 欧美一区二区三区另类 | 免费在线你懂的| 日本精品视频在线观看| 亚洲天堂1区| 亚洲三区四区| 91精品国产综合久久久蜜臀图片| 久久久久久久久久久久久久久久久久 | 亚洲精品黑牛一区二区三区| 亚洲国产精品久久久久婷婷老年| 欧美日韩亚州综合| 午夜影院欧美| 亚洲人成网站色在线观看| 精品亚洲一区二区三区在线观看| 亚洲在线电影| 成人影视在线播放| 国产另类自拍| 欧美精品免费视频| 蜜桃视频在线观看免费视频网站www| 国产在线高清精品| 色一情一伦一子一伦一区| 一区二区日韩欧美| 黄色av免费在线观看| 国产日韩在线一区二区三区| 欧美日韩电影在线| 日本免费新一区视频| 性国裸体高清亚洲| 欧美人成在线观看| 久久久久成人精品| 亚洲一区欧美一区| 国产一区日韩欧美| 国产视频一区二区| 中国一级大黄大黄大色毛片| 丝袜情趣国产精品| 国产日韩欧美高清在线| 国产剧情一区| 国产乱视频在线观看| 秋霞毛片久久久久久久久| 日韩国产一区三区| 91在线视频观看| 欧美巨大xxxx| 水中色av综合| 欧美日韩国产精品一区二区| 亚洲视频视频在线| 国产精品无码永久免费888| 精品国产aⅴ| 超碰最新在线| 久久电影一区二区| 亚洲影视在线播放| 国产欧美日韩一级| 日韩在线观看不卡| 九色丨porny丨| 电影午夜精品一区二区三区| 亚洲欧美国产另类| 亚洲欧洲精品成人久久奇米网| 国产精品大片免费观看| 欧美成人a交片免费看| 四虎最新网站| 中文字幕亚洲欧美日韩在线不卡| 欧美成人日韩| ****av在线网毛片| 熟妇人妻va精品中文字幕 | 51国偷自产一区二区三区的来源| 国产精品久久亚洲不卡| 人妻激情另类乱人伦人妻| 欧美一区二区三区四区五区| 国产99一区视频免费| 亚洲一区高清| 性亚洲最疯狂xxxx高清| 欧美性xxxxxx少妇| va天堂va亚洲va影视| 特级毛片在线观看| 亚洲高清在线播放| 欧美中文字幕第一页| 日韩欧美在线一区二区三区| 久久久久久影视| 亚洲日本欧美| 自拍偷拍亚洲| av免费在线免费| 草草久视频在线观看电影资源| 亚洲午夜精品一区二区三区| 国产精品成人在线| www.欧美三级电影.com|