數據挖掘在信用卡詐騙中的應用研究_第1頁
數據挖掘在信用卡詐騙中的應用研究_第2頁
數據挖掘在信用卡詐騙中的應用研究_第3頁
數據挖掘在信用卡詐騙中的應用研究_第4頁
數據挖掘在信用卡詐騙中的應用研究_第5頁
已閱讀5頁,還剩60頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數據挖掘在信用卡詐騙中的應用研究摘要信用卡在日常生活中越來越普及,給人們的日常生活帶來了諸多便利。作為一種新型的金融工具,銀行找到了新的利潤來源,但是與此同時,信用卡作為一種無抵押的信用貸款工具,作為發行方的銀行如果錯誤判斷了信用卡用戶的還款能力,往往會承擔很多未知的風險。如果信用卡用戶長期無法按時償還信用卡欠款金額,甚至惡意拖欠欠款,則將構成信用卡詐騙,損害銀行的利益,這是一種犯罪行為。因此,很有必要將數據分析和數據挖掘的相關技術引用到信用卡欺詐檢測上,幫助銀行準確識別出潛在的違約用戶,這能幫助銀行免受信用卡欺詐帶來的損失。本次設計將采用一個kaggle網站上的臺灣銀行信用卡數據集,利用描述性統計、可視化作圖等工具對數據集進行數據探索。對數據集有了初步了解之后,對數據集進行數據清洗和轉換,再通過使用邏輯回歸、神經網絡、決策樹等常用的機器學習算法,對數據集建立模型。使用F1分數、準確率等常用的評價指標評價不同算法的得到的模型再測試集上的性能表現。關鍵詞: 數據分析,數據挖掘,信用卡欺詐AbstractCreditcardsarebecomingmoreandmorepopularindailylife,bringingconveniencetopeople'sdailylives.Asanewtypeoffinancialinstrument,thebankhasfoundanewsourceofprofit,butatthesametime,creditcardasanunsecuredcreditloantool,astheissuer'sbank,ifitmisjudgesthecreditcarduser'srepaymentability,itwilloftenTakeonmanyunknownrisks.Ifthecreditcarduserfailstorepaythecreditcarddebtamountontime,orevenmaliciouslydefaultsonthearrears,itwillconstitutecreditcardfraudanddamagetheinterestsofthebank.Thisisacriminalact.Therefore,itisnecessarytorefertothetechnologyofdataanalysisanddataminingtocreditcardfrauddetectiontohelpbanksaccuratelyidentifypotentialdefaultusers,whichcanhelpbanksavoidthelossescausedbycreditcardfraud.ThisdesignwilluseaTaiwanesebankcreditcarddatasetonthekagglewebsitetoexploredatasetsusingtoolssuchasdescriptivestatisticsandvisualmapping.Afterapreliminaryunderstandingofthedataset,thedatasetiscleanedandtransformed,andthedatasetismodeledbyusingcommonlyusedmachinelearningalgorithmssuchaslogisticregression,neuralnetworks,anddecisiontrees.TheperformanceofthemodelretestsetobtainedbydifferentalgorithmswasevaluatedusingcommonlyusedevaluationindexessuchasF1scoreandaccuracy.Keywords:Dataanalysis,datamining,creditcardfraud目錄1引言 11.1 研究背景與意義 11.2國內外研究現狀 21.3研究內容及主要工作 22數據挖掘方法 32.1數據挖掘基本概念 32.2本文涉及的方法的基本概念 42.2.1邏輯回歸 42.2.2多項式拓展 52.2.3樸素貝葉斯 62.2.4神經網絡 72.2.5主成分分析 82.2.6決策樹 93使用的數據集 103.1數據來源和簡介 103.2數據探索 123.2.1數據質量探索 123.2.2連續變量描述性統計 133.2.3違約率 153.2.4離散變量數據分布 153.2.5連續變量數據分布 263.2.6相關性探索: 314數據預處理 334.1異常值處理 334.2增刪變量以及主成分分析 344.3離散變量進行啞變量編碼 374.4連續變量標準化 384.5多項式拓展 384.6劃分數據集 395數據挖掘 415.1模型評價指標 415.1.1F1分數 415.1.2AUC分數 415.2邏輯回歸 425.2.1單變量邏輯回歸 425.2.2選擇正則化參數 445.2.3性能評價 475.3神經網絡 495.3.1選擇隱藏層規模 495.3.2模型評價 525.4樸素貝葉斯 535.4.1實現過程 535.4.2性能評價 545.5決策樹 555.5.1主要過程 555.5.2性能評價 565.6模型比較 57結論 58參考文獻 59致謝 601引言研究背景與意義隨著經濟的全球化發展,國內國外的銀行紛紛進入全球市場。銀行再盈利方面,傳統模式的存儲盈利已經不餓滿足銀行的需求,借此機會,信用卡普及了。信用卡再上世紀五十年代誕生于美國,作為信用卡行業最發達的國家,美國的信用卡主要有維薩(VISA)、萬事達(MasterCard)、美國運通(AmericanExpress)和大來(DinnersClub)?,F如今,大多數國家緊隨美國的不發,銀行大力推廣信用卡,同時信用卡這一金融工具發展的越來越成熟。 在信用卡發展的早期階段,各大機構為了能夠吸引到大量的用戶來使用自家的信用卡,往往會降低信用卡的申請門檻,大量的發行信用卡,搶占新興的市場份額。得益于這種政策,截止到1970年,超過一般的美國人使用上了信用卡。知道2017年,VISA的全球交易額已經達到二10.21萬億美元,市場份額超過了50%。 隨著信用卡普及率逐年上升,信用卡用戶不能按時還款甚至惡意違約的信用卡欺詐犯罪行為出現的越來越頻繁。根據央行統計報告顯示,截止到2013年,我國的信用卡壞賬總額已經高達251.92億元,比上一年年末,增加了105.34億元,增幅達到了71.86%。出現了這么嚴峻的信用卡欺詐請款,除了信用卡發卡前的審核準確率較低之外,歸根結底,不餓能及時找出高違約風險的信用卡用戶才是最重要的原因。上訴原因導致了信用卡惡意違約的犯罪愈演愈烈。因此。利用新的技術手段來提高信用卡發卡前對申請人的信用評級準確率,和及時發現已有用戶中的高風險用戶,已經勢在必行。如何從信用卡數據集中挖掘出有用的信息,結合數據分析分析信用卡違約用戶群的群體特征,將非常有助于銀行避免發放信用卡給無力按時償還欠款的用戶,同時挖掘出已有用戶群中違約風險較高的用戶群,對其提高警惕,采取如降低信用額度等措施,從根源上避免銀行遭受不必要的經濟損失。另一方面,將數據分析和數據挖掘用在銀行信用卡信用欺詐檢測上,也能讓優質的信用卡申請人更加快速便捷的拿到申請的信用卡,不論對于廣大用戶而言還是對于銀行而言,都是一種互利共贏的方式。1.2國內外研究現狀 在國外,BrauseR等人于1999年通過將關聯規則、高斯核函數和神經網絡等算法應用在信用卡欺詐數據集上,得到了不錯的模型預測準確率。2011年,BhattacharyyaS采用了不同以往的方法,將隨機森林、邏輯回歸、支持向量機等常用的及其學習方法運用到國際信用卡業務交易的數據集上,對比分析三種模型在信用卡欺詐檢測應用中的效果。在國內,早期較為常用的是決策樹和邏輯回歸這兩種算法。在2008年,楊璽采用了支持向量機算法。2010年,劉艷紅提出將支持向量描述算啊SVDD應用到這方面的想法,而且兩階段信用卡欺詐檢測模型克服了信用卡數據包含的信息量可能不充足的問題。2011年,段剛龍等人提出了將F-scores、支持向量機相結合的途徑,成功克服了模型泛化能力不夠強的問題。總的來說,沒有哪一種算法能普遍適用于所有的數據集,同種算法在不同的數據集中表現可能有很大的差別。1.3研究內容及主要工作這篇文章所用到的數據集為kaggle網站上的臺灣銀行信用卡數據集,并在這個數據集上,使用常用的數據分析方法和常用的機器學習算法,對數據集進行分析和建模,達到能用于預測的目的。 第一章作為引言,簡單介紹這個題目的背景和研究意義,簡單介紹國內和國外在這方面的研究情況,各種研究方法的優點。同時介紹這篇文章的整體思路和基本的寫作框架。 第二章作為文中所用到的相關知識的理論介紹,包括各種常用的數據分析方法和常用的數據挖掘方法的介紹。 第三章著重與數據探索,簡單介紹這次題目所用到的數據集的基本情況,并且對該數據集進行初步的探索 第四章將引入常用的模型評價指標,并進行數據挖掘過程中的數據預處理、第五章側重于將數據挖掘應用在數據集上的研究,建立模型,比較不同數據挖掘方法的效果,并對全文做出總結。同時指出這邊文章中的不足之處和進一步完善的方法。2數據挖掘方法2.1數據挖掘基本概念 數據挖掘,即DataMining,不同于傳統的分析,是指在數據中挖掘出有價值的信息,期間可能用到一些機器學習的算法,數據挖掘知識覆蓋面廣泛,涉及統計學、計算機等專業領域的知識。數據挖掘可以分為有監督學習和無監督學習兩種形式,前者所引用的數據集中,每條數據記錄除了包含輸入變量之外,還包含了輸出的類標簽。而無監督學習的數據集記錄則不包含真實的類標簽,只包含了對應的輸入變量值。此篇文章屬于有監督學習范疇。 數據挖掘整個過程可以大致分為以下幾個步驟:定義挖掘目標:首先得明確本次數據挖掘過程的目標是什么,想要達到什么效果。數據采樣:即明確數據來源,手動抽取數據集或者利用現成的數據集,數據集質量要能保證相關性、可靠性和有效性,不能忽視采用的數據集的數據質量,否則數據挖掘的效果會很差,甚至造成誤導。數據探索:對采用的數據集進行初步的探索,可以進行描述性統計或者可視化等常用的方法,分析數據集中各個變量之間的相關性,目標變量和輸入變量之間的相關性,變量取值的規律性,形成對數據集和數據集質量的初步認知數據預處理:數據集一般都會有錯誤數據或者缺失數據,可能造成這種情況的原因包含人工錄入數據過程出錯、數據存儲過程中意外丟失損壞、虛假數據等。數據預處理一般包含了缺失值處理、異常值處理、均值詭異、主成分分析、特征工程等過程。建立模型:沒有哪一種方法是適合解決所有問題的,即使是相似的題目,用同一種算法得到的效果也有可能天差地別。在這一步應該分析所選的題目適合使用哪些方法,實踐過程應該如何調整所選擇的方法的參數。將模型理論知識和實踐相結合。模型評價:如果數據挖掘過程中使用了多種方法,我們該如何評價哪種方法的效果更好,值得投入到實際應用中呢?這個時候就需要我們選擇合適的模型評價指標,根據數據集的數據質量和題目的具體情況,選擇的模型評價指標往往不同。2.2本文涉及的方法的基本概念2.2.1邏輯回歸線性回歸是通過一系列的點,計算出一條曲線來擬合這些點,從而對未來輸入的值進行連續型變量的預測,預測上的輸出結果值域為實數。而邏輯回歸不同于線性回歸,主要用于離散變量的二分類。假設數據集中每一條記錄為(xi,yi),其中共有m個樣本,其中第i個樣本x?類標簽預測值公式如下:h其中x為輸入的特征向量,θT為模型參數的轉置,作出?x~由上圖可見,?θTx邏輯回歸代價函數如下:Jθ=1其中:costhθ(xicosthθ(xi對每個參數進行如下梯度下降過程:θj=θ如果要擬合的邏輯回歸模型較為復雜,一般需要進行多項式拓展,才能得到更好的效果。2.2.2多項式拓展 假設數據集中每一條記錄為(xi,yi),其中共有m個樣本,其中第i個樣本x? 為了模型能夠擬合更加復雜、維度更高的數據集,使擬合效果更好,可以對原始數據集進行多項式拓展,將每個屬性跟其他屬性結合成二次項、三次項或者更高次項,并插入到原始數據集中,一并進行數據挖掘。2.2.3樸素貝葉斯樸素貝葉斯是一個經典的統計學習方法,可用于分類。之所以稱之為樸素,是指各個變量之間相互獨立。但是在實際生活中,數據集所有變量之間相互獨立的條件往往不會得到滿足,用于分類的話,由于變量之間難免會有相關性,效果可能沒有理論上的那么好。樸素貝葉斯用于分類時基于一下貝葉斯公式:P(B|A)=P假設B為樣本屬于某個類,A為樣本的已有特征,那么由于假設變量之間相互獨立,P(A|B)為整個數據集中,樣本屬于該類的情況下,A中所有已有特征各自出現的概率的乘積。例如:P(“屬于第二類”|“屬性1=1,屬性2=2”)=P“屬性1=1,屬性2=2”P2.2.4神經網絡神經網絡模仿了人類大腦神經元之間的信息傳遞過程,由多個層以及許多神經元節點構成,每個節點通過一個激活函數對前一層的神經網絡節點的輸出進行運算,再將運算結果傳遞到下一層神經元。同時,每個神經元之間的連接,是加上了不同的權重的。 更具神經網絡的層次結構,一般可以分為輸入層、隱藏層、輸出層。輸入層就是用于輸入樣本數據,經過隱藏層的復雜運算,如前向傳播、后向傳播之后,輸出到輸出層。如下圖所示,下圖未插入一行偏置單元: 假設aij為第j層第i個單元的值,aaah以上就是前向傳播求預測值的過程接下來是后向傳播求神經元誤差值,進行梯度下降調整參數的過程:在前面的邏輯回歸小結有提到sigmoid函數,而神經網絡也用到了sigmoid函數作為激活函數。由上面的前向傳播過程,可以得到輸出層誤差為:δ=根據微積分中的鏈式求導,第l層的值為a(l),下一層的值為a(l+1)。此時把δg往前計算,就能求出各層的而誤差,進而使用邏輯回歸中的梯度下降優化模型,不斷調整參數。使得代價函數的值最小。2.2.5主成分分析有時候數據集過于龐大,運算量過大,導致耗時過長,可以適當降低數據集的維度,對數據集進行壓縮,減少其占用的存儲空間,同時加快機器的運行速度。其次,更低維度的數據也更方便對其進行可視化。主成分分析整個過程主要是尋找一個維度較低的空間,把原始數據集映射到低緯度空間中,而且原始數據到低維空間的投影距離最小,及最小化誤差。計算低維空間向量包含:計算協方差、奇異值分解、計算低維矩陣、轉換為低維數據這幾個主要步驟。協方差矩陣:C=再對協方差矩陣進行奇異值分解。主成分分析過程中,原始數據集到新的低維空間的距離可以采用平均投影誤差的平房來衡量:J=1其中,xapproxJ得到的結果就是從n維空間像更低維度的k維空間進行映射。2.2.6決策樹決策樹是一種常見的分類算法,性能優秀。決策樹一般需要進行以下步驟:1.利用特征A的某個取值a,將數據分為兩部分,計算A=a時的基尼系數2.遍歷所有特征的所有取值,重復步驟1,直到滿足停止條件,算法的停止條件既可以選擇樣本包含的最小樣本數,又可以選擇基尼系數閾值3.開始剪枝,避免模型過擬合,泛化性能差。3使用的數據集3.1數據來源和簡介此次題目采用來自kaggle網站上面的一個臺灣銀行信用卡數據集,該數據集每條數據集記錄包含了信用卡用戶的個人基本信息,如性別、年齡、婚姻情況等基本的人口統計學信息。除此之外,每條記錄還包含了2005年4月至2005年9月期間,該用戶應償還的信用卡賬單金額、實際已償還的信用卡金額等信息。而該數據集的類標號則為用戶在下個月是否違約。該數據集總共包含了30000條記錄,每條數據記錄包含了25個屬性,其中一個屬性為類標簽。其中BILL_AMT變量為對應月分的賬單金額,賬單金額=之前月份欠款+本月新的欠款,正數表示有為欠款,負數表示卡中有存款結余。其中PAY_AMT變量為對應月份的還款金額,PAY_AMT=償還的欠款+存入信用卡的錢,大于BILL_AMT表示按時還款,小于BILL_AMT但大于最低還款限度表示延遲還款,小于最低還款限度表示違約。類標簽為下個月(10月)用戶是否違約。數據集的主要字段如下:ID:信用卡客戶ID號LIMIT_BAL:以新臺幣計算的信貸金額(包括個人和家庭/補充信貸)SEX:性別(1代表男性,2代表女性)EDUCATION:受教育程度(1=研究生,2=大學,3=高中,4=其他5=未知,6=未知)MARRIAGE:婚姻狀況(1=已婚,2=單身,3=其他)AGE:年齡PAY_0:2005年9月的還款記錄(0=按時付款,1=延遲一個月付款,2=延遲兩個月付款,...8=延遲八個月付款,9=延遲九個月及以上付款)PAY_2:2005年8月的還款情況(特征值含義如上)PAY_3:2005年7月的還款情況(特征值含義如上)PAY_4:2005年6月的還款情況(特征值含義如上)PAY_5:2005年5月的還款情況(特征值含義如上)PAY_6:2005年4月的還款情況(特征值含義如上)BILL_AMT1:2005年9月賬單金額(新臺幣)BILL_AMT2:2005年8月賬單金額(新臺幣)BILL_AMT3:2005年7月賬單金額(新臺幣)BILL_AMT4:2005年6月賬單金額(新臺幣)BILL_AMT5:2005年5月賬單金額(新臺幣)BILL_AMT6:2005年4月賬單金額(新臺幣)PAY_AMT1:2005年9月支付金額(新臺幣)PAY_AMT2:2005年8月支付金額(新臺幣)PAY_AMT3:2005年7月支付金額(新臺幣)PAY_AMT4:2005年6月支付金額(新臺幣)PAY_AMT5:2005年5月支付金額(新臺幣)PAY_AMT6:2005年4月支付金額(新臺幣)default.payment.next.month:是否違約還款(1代表是,0代表否)3.2數據探索3.2.1數據質量探索由上圖可知,該數據集總共有30000條樣本,沒有缺失值,數據類型有int和float,都為數值型,但有些變量比如SEX,EDUCATION雖然是數值類型,但其實是分類變量,取值范圍在書籍集說明文檔中有做說明。3.2.2連續變量描述性統計由上圖可以觀察到,賬單金額從BILL_AMT6到BILL_AMT9,均值逐漸上升,說明人們在2005年4月到9月這段時間越來越傾向于信用卡消費,這種消費方式越來越被人們接受。最小值和最大值區間跨度比較大,最好進行連續變量標準化。每個月的賬單金額中位數都為20000左右。由上圖可以得出:從PAY_AMT6到PAY_AMT1分別代表了2005年4月到9月,每個月的還款金額。均值和中位數隨著時間的推移,都有上升的趨勢,說明人們的還款能力逐漸提高。最大最小值跨度同樣比較大,需要進行標準化。由上圖可得:信貸金額取值范圍從10000大100萬不等,均值為16萬,中位數為14萬,說明大多數人的額度為15萬新臺幣左右。取值范圍跨度同樣比較大,需要進行標準化。3.2.3違約率違約率為0.2212,樣本不平衡,存在偏斜類的現象。模型評價指標可以考慮使用F1分數,而不是只用準確率。因為如果只用準確率的話,為了得到更高的準確率,可能模型會將所有樣本猜測為沒有違約,這樣最差的模型也能得到78%左右的準確率。模型評價指標將在第五章進行討論3.2.4離散變量數據分布主要代碼如下:indexName=('SEX','MARRIAGE','EDUCATION','PAY_0','PAY_2','PAY_3','PAY_4','PAY_5','PAY_6')foriinindexName:print(i,'取值分布為:\n',data[i].value_counts(),'\n')figure,(ax1,ax2)=matplotlib.pyplot.subplots(2,1)ax1.hist(data.loc[data['default.payment.next.month']==0,'EDUCATION'])ax1.set_title('NoDefault')ax2.hist(data.loc[data['default.payment.next.month']==1,'EDUCATION'])ax2.set_title('Default')matplotlib.pyplot.xlabel('EDUCATION')matplotlib.pyplot.show()運行結果如下:SEX:性別(1代表男性,2代表女性)由圖可以得出,女性用戶數較多,大概是男性的1.5倍婚姻狀況(1=已婚,2=單身,3=其他)單身的用戶人數比已婚的用戶人數多,但是已婚人士的違約率高于單身人士出現了文檔中未解釋的異常值,需要對異常值進行處理。(1=研究生,2=大學,3=高中,4=其他5=未知,6=未知)大學學歷人數最多,高中學歷用戶的違約率最高,大概在50%,而且隨著學歷的升高,違約率減少。出現了說明文檔中未做解釋的異常值,需要進行異常值處理,異常值數量較少,可以考慮直接將包含異常值的數據記錄刪除。(-1=按時付款,1=延遲一個月付款,2=延遲兩個月付款,...8=延遲八個月付款,9=延遲九個月及以上付款)一旦超過2個月未還款,違約率將超過50%不難看出,沒有違約的子圖頻數更高,大都數人會選擇按時還款或者償還最低還款,避免違約情況出現。其他探索:主要代碼如下:defmyBoxplot(feature1,feature2,feature3):matplotlib.pyplot.figure()seaborn.boxplot(x=feature1,y=feature2,hue=feature3,data=data,showfliers=False)matplotlib.pyplot.show()運行結果如下:SEX:性別(1代表男性,2代表女性)MARRIAGE:婚姻狀況(1=已婚,2=單身,3=其他)已婚用戶年齡普遍高于未婚用戶,但差距較小已婚男性年齡普遍高于已婚女性,未婚男性年齡普遍高于未婚女性。EDUCATION:受教育程度(1=研究生,2=大學,3=高中,4=其他5=未知,6=未知)MARRIAGE:婚姻狀況(1=已婚,2=單身,3=其他)已婚用戶年齡普遍高于未婚用戶,MARRIAGE取值為其他的用戶,在上面幾個箱型圖中,年齡普遍大于已婚用戶和單身用戶,有可能是離婚用戶。不同學歷的用戶群在年齡上的分布大致相同,受教育程度對年齡分布的影響不明顯。SEX:性別(1代表男性,2代表女性)信貸金額不論男女,都隨著年齡的增長而增長,直到大約30歲,之后趨于平穩,50隨之后開始震蕩。男性的信貸金額普遍比女性的高。EDUCATION:受教育程度(1=研究生,2=大學,3=高中,4=其他5=未知,6=未知)MARRIAGE:婚姻狀況(1=已婚,2=單身,3=其他)單身用戶的額度普遍比已婚用戶的額度要低。隨著學歷的升高,用戶往往能得到更大的信貸額度。不論教育程度高低,違約人數都是占少部分。,信貸金額主要集中在10萬到20萬新臺幣。3.2.5連續變量數據分布主要代碼如下:figure,(ax1,ax2)=matplotlib.pyplot.subplots(2,1)ax1.hist(data.AGE[data['default.payment.next.month']==1],bins=20)ax1.set_title('Default')ax2.hist(data.AGE[data['default.payment.next.month']==0],bins=20)ax2.set_title('NoDefault')matplotlib.pyplot.xlabel('Age')matplotlib.pyplot.ylabel('NumberofObservations')matplotlib.pyplot.show()運行結果如下:除了在30~35歲這個年齡段,用戶的履約能力更高之外,其他年齡段的分布沒有明顯區別,信用卡的主要用戶集中在25到30歲,然后隨著年齡的逐漸增長,使用信用卡的人越來越少。中年人青年人客戶消費需求多,存在購房、購車、下一代教育等大額消費需求,但與此同時,這各群體正是社會的中堅力量,還款能力并不弱。信貸金額的峰值在5萬新臺幣附近,大部分是0-10萬新臺幣的信用額度不論用戶違約與否,大多數賬單金額集中在5萬新臺幣附近,違約與否的信貸金額的分布沒有顯著差別。說明用戶是否違約和每月的賬單金額大小沒有明顯的關系。未違約用戶每個月還款金額與違約用戶每月還款金額相比,分布上沒有明顯差別3.2.6相關性探索:主要代碼如下:matplotlib.pyplot.figure()seaborn.heatmap(data.iloc[:,0:-1].corr())matplotlib.pyplot.show()運行結果如下:BILL_AMT之間的相關性隨著月間距離的增加而減小。相關性最低的是9-4月。PAY之間沒相關性PAY_AMT之間的相關性隨著月間距離的增加而減小。相關性最低的是9-4月。類標簽和其他變量的相關性:LIMIT_BAL負相關,跟6個PAY變量關系比較大,正相關,而且跟PAY_0關系最大既然PAY變量與類標簽相關性較高,那么如果建模的時候準確率太低的話,可以嘗試只用PAY變量建模4數據預處理數據集在采集數據和保存數據的過程中難免會出現錯誤,需要進行異常值處理和缺失值處理。同時,對數據進行轉換有利于挖掘出更有價值的信息,建立性能更好的模型。4.1異常值處理在第三章的數據探索中,我發現數據集中,有些記錄某個變量的取值不在說明文檔中,除了查閱kaggle官方的數據集說明文檔之外,經過在網上查閱其他關于該數據集變量的說明文檔,現在開始對數據集中的異常值進行處理。在PAY變量中,異常值0表示償還了最小金額,區別與按時還款,但是不屬于違約。EDUCATION變量中,0,5,6三個取值在官方文檔中解釋為unknown,為了方便,歸入到4(other)中。其他屬性的異常值未找到合適的解釋,包含這些異常值的記錄將直接予以刪除。主要代碼如下:#異常值處理:#EDUCATION異常值0,4,5,6全部歸為4(其他)print('修正前的education取值:\n',data.EDUCATION.value_counts())index=list((data.EDUCATION==5)|(data.EDUCATION==6)|(data.EDUCATION==0))data.loc[index,'EDUCATION']=4print('修正后的education取值:\n',data.EDUCATION.value_counts())#其他變量異常值直接刪除print('修正前的MARRIAGE取值:\n',data.MARRIAGE.value_counts())index=list(data.MARRIAGE!=0)data=data.loc[index,:]print('修正后的MARRIAGE取值:\n',data.MARRIAGE.value_counts())結果如下:4.2增刪變量以及主成分分析刪除變量ID,該變量唯一標識一個客戶,對改題目沒有意義:主要代碼如下:#刪除變量IDdataX.drop(['ID'],axis=1,inplace=True)print('刪除了變量ID后剩余的變量',dataX.columns)運行結果如下:在之前的數據分析過程中,我發現了男人更可能違約,已婚人士更傾向于違約,因此把這兩個變量組合成一個新的變量SEXandMARRIAGE,插入到數據集中:主要代碼如下:#發現男人更有可能違約,已婚人士更有可能違約,進行特征工程,組合這兩個變量dataX['SEXandMARRIAGE']=0dataX.loc[((dataX.SEX==1)&(dataX.MARRIAGE==1)),'SEXandMARRIAGE']=1#marriedmandataX.loc[((dataX.SEX==1)&(dataX.MARRIAGE==2)),'SEXandMARRIAGE']=2#singlemandataX.loc[((dataX.SEX==1)&(dataX.MARRIAGE==3)),'SEXandMARRIAGE']=3#divorcedmandataX.loc[((dataX.SEX==2)&(dataX.MARRIAGE==1)),'SEXandMARRIAGE']=4#marriedwomandataX.loc[((dataX.SEX==2)&(dataX.MARRIAGE==2)),'SEXandMARRIAGE']=5#singlewomandataX.loc[((dataX.SEX==2)&(dataX.MARRIAGE==3)),'SEXandMARRIAGE']=6#divorcedwomandataX.to_csv('增加變量SEXandMARRIAGE.csv')為了加快神經網絡的運行速度,節省時間,在神經網絡模型中可以選擇采用主成分分析來降低數據集的維度;主要代碼如下:fromsklearn.decompositionimportPCAmodelPCA=PCA()modelPCA.fit(dataX)print('各個變量保留的方差:\n',modelPCA.explained_variance_ratio_)varSum=0#for循環內的變量拿不出來,用這個變量記住要保留幾個變量parameterPCA=0forindexinrange(0,len(modelPCA.explained_variance_ratio_)):varSum=varSum+modelPCA.explained_variance_ratio_[index]ifvarSum>=0.95:print('選取方差貢獻量前',index+1,'個屬性即可保留95%的方差')parameterPCA=index+1print('parameterPCA的值為:',parameterPCA)breakmodelPCA=PCA(n_components=parameterPCA)modelPCA.fit(dataX)#transform之后是ndarraydataX=modelPCA.transform(dataX)dataX=pandas.DataFrame(dataX)print('降維之后數據集規模:',len(dataX),'行',len(dataX.iloc[0,:]),'列')dataX.info()dataX.to_csv('降維完成.csv')4.3離散變量進行啞變量編碼在處理離散變量的時候,應該對離散變量進行啞變量編碼,否則計算代價函數時,都某個取值的距離與到另一個取值的距離是不一樣的,這是不對的,因為一個類個中取值之間應該是在同一個等級上的。把有n種取值的某個屬性,轉換為n維向量,該向量中只有一個元素為1,其余為0,再將該向量插入到數據集中。主要代碼如下:print('轉換為啞變量之前,一共有',len(dataX.iloc[0,:]),'個變量')forcolNameindataX.columns:ifcolNameinindexCategorical:#get_dummies()返回向量數據框dummy=pandas.get_dummies(dataX.loc[:,colName])print('get_dummies(',colName,')返回值類型為:',type(dummy),'有',len(dummy),'行',len(dummy.iloc[0,:]),'列\t','正確答案是',len(dataX.loc[:,colName].unique()),'列')#列拼接print('合并之前有',len(dataX.iloc[0,:]),'列')dataX=dataX.drop([colName],axis=1)dataX=pandas.concat([dataX,dummy],axis=1)print('合并之后有',len(dataX.iloc[0,:]),'列')print('轉換為啞變量之后一共有',len(dataX.iloc[0,:]),'個變量')運行結果如下:4.4連續變量標準化某些變量的值域過大,標準化有助于加快收斂速度,節省時間。主要代碼如下:forcolNameindataX.columns:ifcolNamenotinindexCategorical:colData=dataX.loc[:,colName]dataX.loc[:,colName]=(colData-colData.mean())/colData.std()4.5多項式拓展如果模型擬合效果欠佳,不能得出更復雜的模型,可以考慮使用多項式拓展,形成二次項插入到數據集中。主要代碼如下:#多項式拓展,除了類標簽,此時data中不包含類標簽colName=dataX.columnsforcolIndex1inrange(0,len(colName)):forcolIndex2inrange(colIndex1,len(colName)):print('正在處理第',colIndex1,'列和第',colIndex2,'列')dataX=pandas.concat([dataX,dataX.iloc[:,colIndex1]*dataX.iloc[:,colIndex2]],axis=1)print('多項式拓展之后的數據集info:')dataX.info()dataX.to_csv('多項式拓展完成.csv')4.6劃分數據集將數據集按照6:2:2的比例劃分為訓練集、交叉驗證集合、測試集。定義函數用于讀取數據集。主要代碼如下:defloadData():importpandasimportosdata=pandas.read_csv('dataDone.csv',index_col=0)dataTraining=data.iloc[:int(0.6*len(data)),:]print('訓練集樣本數:\n',len(dataTraining))dataCV=data.iloc[int(0.6*len(data)):int(0.8*len(data)),:]print('交叉驗證集樣本數:\n',len(dataCV))dataTest=data.iloc[int(0.8*len(data)):,:]print('測試集樣本數:\n',len(dataTest))#每次從新進行數據預處理,訓練集違約率都會變化,但調用loadData()不會變化print('訓練集違約率為:',dataTraining['default.payment.next.month'].sum()/len(dataTraining))print('交叉驗證集合違約率為:',dataCV['default.payment.next.month'].sum()/len(dataCV))print('測試集合違約率為:',dataTest['default.payment.next.month'].sum()/len(dataTest))os.system('pause')dataTrainingX=dataTraining.iloc[:,0:-1]dataCVX=dataCV.iloc[:,0:-1]dataTestX=dataTest.iloc[:,0:-1]dataTrainingY=dataTraining.iloc[:,-1]dataCVY=dataCV.iloc[:,-1]dataTestY=dataTest.iloc[:,-1]returndata,dataTrainingX,dataCVX,dataTestX,dataTrainingY,dataCVY,dataTestY5數據挖掘5.1模型評價指標選擇哪種模型評價指標,需要按照具體的數據集和使用的具體的機器學習方法,結合考慮,沒有哪一種模型評價指標是適用于所有模型或者所有問題的。之前的數據分析過程中,我發現了數據集總體違約率大約為22%,是一個傾斜的數據集,此時不應該只考慮準確率,最好使用F1分數,auc分數等作為模型評價指標,能更好的解決偏斜類的問題。5.1.1F1分數假設用TP,TN,FP,FN分別表示真正例,真負例,假正例,假負例,那么精確率precision=TP/(TP+FP)召回率recall=TP/(TP+FN)準確率accuracy=(TP+TN)/(TP+FP+TN+FN)F1分數=2*precision*recall/(pression+recall)同時考慮了精確率和召回率,能有效避免模型把全部樣本歸為一個類別,還能獲得不錯的準確率的情況出現。5.1.2AUC分數ROC曲線和AUC分數也經常被用來衡量二分類分類器的性能。假正率FPR,真正率TPR計算公式如下:FPR=FP/TN+FNTPR=TP/TP+FPTPR的增加以FPR的增加為代價。ROC曲線下的面積就是AUC分數,可以作為模型性能的評價指標。5.2邏輯回歸5.2.1單變量邏輯回歸由于采用的數據集中包含了24個輸入變量,根據之前數據分析章節中的熱度圖可以得知,每個變量與類標簽的相關性不盡相同,為了能更直接的了解到各個輸入變量對模型準確判斷輸入樣本的類標簽的貢獻有多大,可以對各個變量一一建立邏輯回歸模型,計算AUC分數。主要代碼如下:fromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportroc_auc_scoreaucs=list()forindexNameindata.columns[0:-1]:modelLogisticRegression=LogisticRegression()#modelLogisticRegression.fit()要求第一個參數為DataFrame,第二個為SeriesmodelLogisticRegression.fit(pandas.DataFrame(dataTrainingX[indexName]),dataTrainingY)possibilityPositive=numpy.array([score[1]forscoreinmodelLogisticRegression.predict_proba(pandas.DataFrame(dataTestX[indexName]))])auc=roc_auc_score(dataTestY.values,possibilityPositive)aucs.append(auc)#折線圖importmatplotlib.pyplotaspltplt.plot(data.columns[0:-1],aucs)plt.xlabel('columnsName')plt.ylabel('aucScore')plt.show()對每個變量進行單變量邏輯回歸,得到的AUC分數如下:由上圖可以得出,各個變量最低的AUC分數也有0.5,最高達到了0.645.2.2選擇正則化參數為了邏輯回歸模型過擬合,泛化性能差,即在訓練集上表現得非常優秀,但是在測試集和實際應用中性能表現卻不佳,可以為代價函數加上正則化項。選取的正則化參數范圍從0.0001到100,分別用以上正則化參數建立邏輯回歸模型,測試其在交叉驗證集上的性能表現,篩選出最佳的正則化參數,訓練模型并用于實際使用。主要代碼如下:fromsklearn.linear_modelimportLogisticRegressionlambdaRange=[0.0001,0.001,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24,100,1000]accuracyCV=list()foriinlambdaRange:#sag隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度modelLogisticRegression=LogisticRegression(C=(1/i),solver='sag',n_jobs=2)#用values,要求numpy的arraymodelLogisticRegression.fit(dataTrainingX,dataTrainingY)prediction=modelLogisticRegression.predict(dataTrainingX)print('當C=',1/i,'時,\n在訓練集上的正確率為:',len(prediction[prediction==dataTrainingY[:]])/len(prediction))print('在訓練集上預測為1的數量為:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataTrainingY,prediction)recall=recall_score(dataTrainingY,prediction)F1=2*precision*recall/(precision+recall)print('在訓練集上的pecision為:',precision,'\trecall為:',recall,'\tF1分數為:',F1)prediction=modelLogisticRegression.predict(dataCVX)accuracy=len(prediction[prediction==dataCVY[:]])/len(prediction)accuracyCV.append(accuracy)print('在交叉驗證集上的正確率為:',accuracy)print('在交叉驗證集上預測為1的數量為:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataCVY,prediction)recall=recall_score(dataCVY,prediction)F1=2*precision*recall/(precision+recall)print('在交叉驗證集上的pecision為:',precision,'\trecall為:',recall,'\tF1分數為:',F1,'\n')#折線圖找出最佳正則化參數importmatplotlib.pyplotaspltplt.plot(lambdaRange,accuracyCV)plt.xlabel('lambda')plt.ylabel('accuracyCV')plt.show()lambdaBest=lambdaRange[accuracyCV.index(max(accuracyCV))]print('當正則化參數為',lambdaBest,'時,交叉驗證及上正確率最高,為',max(accuracyCV))隨著正則化參數lambda的變化,模型再在交叉驗證集上的準確率如下面圖片所示:由以上折線圖可以得出,隨著正則化參數的增大,交叉驗證集上的性能表現在正則化參數為10.24的時候最佳。下一步使用該正則化參數訓練得到的模型,在測試集上進行檢驗。5.2.3性能評價用最佳正則化參數,在測試集上進行預測,評估模型性能:主要代碼如下:#用最佳的正則化參數在測試上預測prediction=modelLogisticRegression.predict(dataTestX)accuracy=len(prediction[prediction==dataTestY[:]])/len(prediction)print('在測試集上的正確率為:',accuracy)print('在測試集上預測為1的數量為:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataTestY,prediction)recall=recall_score(dataTestY,prediction)F1=2*precision*recall/(precision+recall)print('在測試集上的pecision為:',precision,'\trecall為:',recall,'\tF1分數為:',F1,'\n')#只在測試集上計算auc,目前0.75possibilityPositive=numpy.array([score[1]forscoreinmodelLogisticRegression.predict_proba(dataTestX)])auc=roc_auc_score(dataTestY.values,possibilityPositive)print('測試集上的auc分數為:\n',auc)fromsklearn.metricsimportbrier_score_lossbrier=brier_score_loss(dataTestY.values,possibilityPositive)print('測試集上的brier分數為:\n',brier)由上圖可以得出,當正則化參數為10.24時,邏輯回歸模型在測試集上的正確率為82.2%,F1分數為0.43,表現良好。5.3神經網絡5.3.1選擇隱藏層規模此次選擇的神經網絡僅包含一個隱藏層,一個輸入層和一個輸出層。隱藏層的規模一般為輸入層的整數倍,為了得到更好的效果,在交叉驗證集上對隱藏層的神經元數進行選擇倍數為輸入層的1倍或者2倍。在訓練集上用不同的隱藏層神經元個數進行訓練:主要代碼如下:accuracyCV=list()foriinrange(1,4):model=Sequential()model.add(Dense(input_dim=len(dataTrainingX.iloc[0,:]),output_dim=i*len(dataTrainingX.iloc[0,:])))model.add(Activation('sigmoid'))model.add(Dense(input_dim=i*len(dataTrainingX.iloc[0,:]),output_dim=1))model.add(Activation('sigmoid'))#去掉了,class_mode='binary'pile(loss='binary_crossentropy',optimizer='adam')#300改成100model.fit(dataTrainingX,dataTrainingY,nb_epoch=100,batch_size=1)prediction=model.predict_classes(dataTrainingX)prediction=pandas.DataFrame(prediction)prediction=prediction.iloc[:,0]print('\n當隱藏層神經元個數為',i*len(dataTrainingX.iloc[0,:]),'時:')print('keras在訓練集上的正確率為:',len(prediction[prediction.values==dataTrainingY.values])/len(prediction))print('keras訓練集上預測為1的數量為:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataTrainingY,prediction)recall=recall_score(dataTrainingY,prediction)F1=2*precision*recall/(precision+recall)print('keras在訓練集上的pecision為:',precision,'\trecall為:',recall,'\tF1分數為:',F1)

prediction=model.predict_classes(dataCVX)prediction=pandas.DataFrame(prediction)prediction=prediction.iloc[:,0]accuracy=len(prediction[prediction.values==dataCVY.values])/len(prediction)accuracyCV.append(accuracy)print('keras在交叉驗證集上的正確率為:',accuracy)print('keras在交叉驗證集上預測為1的數量為:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataCVY,prediction)recall=recall_score(dataCVY,prediction)F1=2*precision*recall/(precision+recall)print('keras在交叉驗證集上的pecision為:',precision,'\trecall為:',recall,'\tF1分數為:',F1)numberBest=(accuracyCV.index(max(accuracyCV))+1)*len(dataTrainingX.iloc[0,:])print('當隱藏層神經元個數為',numberBest,'時,在交叉驗證集上的正確率最高,為',max(accuracyCV))matplotlib.pyplot.plot([1,2,3],accuracyCV)matplotlib.pyplot.xlabel('units')matplotlib.pyplot.ylabel('accuracyCV')matplotlib.pyplot.show()運行結果如下:可以得出,當隱藏層的神經元個數和輸入層神經元個數相等的時候,模型泛化性能最佳,隨著隱藏層神經元個數的增加,開始出現過擬合的情況,即在訓練集上表現優秀,在交叉驗證集上表現的很差。5.3.2模型評價選用上一步得到的神經元規模,訓練模型并在測試集上進行檢驗。主要代碼如下:#在測試集上預測:model=Sequential()model.add(Dense(input_dim=len(dataTrainingX.iloc[0,:]),output_dim=numberBest))model.add(Activation('sigmoid'))model.add(Dense(input_dim=numberBest,output_dim=1))model.add(Activation('sigmoid'))#去掉了,class_mode='binary'pile(loss='binary_crossentropy',optimizer='adam')#300改成100model.fit(dataTrainingX,dataTrainingY,nb_epoch=100,batch_size=1)prediction=model.predict_classes(dataTestX)prediction=pandas.DataFrame(prediction)prediction=prediction.iloc[:,0]print('keras在測試集上的正確率為:',len(prediction[prediction.values==dataTestY.values])/len(prediction))print('keras測試集上預測為1的數量為:',len(prediction[prediction==1]))fromsklearn.metricsimportprecision_score,recall_score,f1_scoreprecision=precision_score(dataTestY,prediction)recall=recall_score(dataTestY,prediction)F1=2*precision*recall/(precision+recall)print('keras在測試集上的pecision為:',precision,'\trecall為:',recall,'\tF1分數為:',F1)準確率為0.78,F1分數為0.432,相比訓練集上的表現,說明模型出現了過擬合,表現不好。5.4樸素貝葉斯5.4.1實現過程主要代碼如下:modelNaiveBayes=GaussianNB()modelNaiveBayes.fit(dataTrainingX,dataTrainingY)prediction=modelNaiveBayes.predict(dataTrainingX)#第0行第1列的數表示y_true中值為0,y_pred中值為1的個數print('訓練集混淆矩陣:\n',metrics.confusion_matrix(dataTrainingY,prediction))precision=precision_score(dataTrainingY,prediction)recall=recall_score(dataTrainingY,prediction)F1=2*precision*recall/(precision+recall)print('訓練集上的正確率為:',len(prediction[prediction==dataTrainingY.values])/len(prediction))print('訓練集上的pecision為:',precision,'\trecall為:',recall,'\tF1分數為:',F1)#在測試集上驗證prediction=modelNaiveBayes.predict(dataTestX)print('測試集混淆矩陣:\n',metrics.confusion_matrix(dataTestY,prediction))precision=precision_score(dataTestY,prediction)recall=recall_score(dataTestY,prediction)F1=2*precision*recall/(precision+recall)print('測試集上的正確率為:',len(prediction[prediction==dataTestY.values])/len(prediction))print('測試集上的pecision為:',precision,'\trecall為:',recall,'\tF1分數為:',F1)5.4.2性能評價運行結果如下:由上圖可以看出,樸素貝葉斯在訓練集上的正確率為80.3%,F1分數為0.35測試集上的正確率為80.4%,F1分數為0.35模型性能良好5.5決策樹5.5.1主要過程主要代碼如下:fromsklearnimportmetricsfromsklearn.treeimportDecisionTreeClassifierimportmyFunctionfromsklearn.metricsim

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。