日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习安然数据集分析报告

發(fā)布時間:2025/4/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习安然数据集分析报告 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

項目背景

安然曾是 2000 年美國最大的公司之一。輝煌時期,市值高達(dá)700億美元。2002 年,由于其存在大量的企業(yè)欺詐行為,這個昔日的大集團以極快的速度土崩瓦解。 在隨后聯(lián)邦進(jìn)行的調(diào)查過程中,大量有代表性的保密信息進(jìn)入了公眾的視線,包括成千上萬涉及高管的郵件和詳細(xì)的財務(wù)數(shù)據(jù)。 你將在此項目中扮演偵探,運用你的新技能,根據(jù)安然丑聞中公開的財務(wù)和郵件數(shù)據(jù)來構(gòu)建相關(guān)人士識別符。利用機器學(xué)習(xí)算法進(jìn)行數(shù)據(jù)分析,從郵件和財務(wù)數(shù)據(jù)中找出犯罪嫌疑人。

數(shù)據(jù)集初步探索

加載數(shù)據(jù)集

首先我們加載數(shù)據(jù)集

with open("final_project_dataset.pkl", "r") as data_file:data_dict = pickle.load(data_file)

電子郵件和財務(wù) (E+F) 數(shù)據(jù)字典被存儲在 pickle 文件中,該文件可直接存儲和加載 python 對象,非常方便。

數(shù)據(jù)集初步分析

分析發(fā)現(xiàn)我們讀取的數(shù)據(jù)數(shù)據(jù)實際上是以字典形式進(jìn)行。隨機取一個字典,其存儲結(jié)構(gòu)如下所示:

{METTS MARK:{'salary': 365788, 'to_messages': 807, 'deferral_payments': 'NaN', 'total_payments': 1061827, 'exercised_stock_options': 'NaN', 'bonus': 600000, 'restricted_stock': 585062, 'shared_receipt_with_poi': 702, 'restricted_stock_deferred': 'NaN', 'total_stock_value': 585062, 'expenses': 94299, 'loan_advances': 'NaN', 'from_messages': 29, 'other': 1740, 'from_this_person_to_poi': 1, 'poi': False, 'director_fees': 'NaN', 'deferred_income': 'NaN', 'long_term_incentive': 'NaN', 'email_address': 'mark.metts@enron.com', 'from_poi_to_this_person': 38}}

在預(yù)處理此項目時,我們已將安然郵件和財務(wù)數(shù)據(jù)與字典結(jié)合在一起,字典中的每對鍵值對應(yīng)一個人。 字典鍵是人名,值是另一個字典(包含此人的所有特征名和對應(yīng)的值)。 數(shù)據(jù)中的特征分為三大類,即財務(wù)特征、郵件特征和 POI 標(biāo)簽。

財務(wù)特征 : [‘salary’, ‘deferral_payments’, ‘total_payments’, ‘loan_advances’, ‘bonus’, ‘restricted_stock_deferred’, ‘deferred_income’, ‘total_stock_value’, ‘expenses’, ‘exercised_stock_options’, ‘other’, ‘long_term_incentive’, ‘restricted_stock’, ‘director_fees’] (單位均是美元)

郵件特征 : [‘to_messages’, ‘email_address’, ‘from_poi_to_this_person’, ‘from_messages’, ‘from_this_person_to_poi’, ‘shared_receipt_with_poi’] (單位通常是電子郵件的數(shù)量,明顯的例外是 ‘email_address’,這是一個字符串)

POI 標(biāo)簽 : [‘poi’] (boolean,整數(shù))

數(shù)據(jù)特征

分析這個數(shù)據(jù)字典,我們發(fā)現(xiàn)每個人一共有20個特征可以用于分析,其中的poi不是特征,而是label/target

數(shù)據(jù)點總數(shù)

分析整個數(shù)據(jù)字典,我們發(fā)現(xiàn)一共有146個數(shù)據(jù)點(人)。

POI統(tǒng)計

POI( Person of interest )是嫌疑犯的意思,數(shù)據(jù)集有一個標(biāo)簽(label)就是嫌疑犯,所以我們只需要統(tǒng)計
data_dict[preson name][‘poi’] == 1
的數(shù)量就可以了。

統(tǒng)計發(fā)現(xiàn)有18個。

缺失的特征

數(shù)據(jù)集并不是每個特征后都有明確的值,有很多信息的特征是缺失的。對于salary特征,很多人的信息就是NaN。146個數(shù)據(jù)點(人)中,只有95個人有salary的具體信息。有111個人有郵箱地址,其他人的郵箱地址信息為NaN。

異常值調(diào)查和處理

我們在分析財務(wù)數(shù)據(jù)salary和bounds之間的關(guān)系時發(fā)現(xiàn)了一個極為異常額異常值,如下圖所示

明顯在右上角有一個極為異常的點,獎金和薪水遠(yuǎn)遠(yuǎn)高于其他人。我們通過代碼尋找一下獎金和薪水都極高的人,看是否還有其他的異常值。

data_dict = sorted(data_dict.items(), key = lambda x : x[1]["salary"] ,reverse=True)for x in data_dict :if x[1]['salary'] > 1000000 and x[1]['bonus'] > 5000000 :print x[0], x[1]['salary'], x[1]['bonus']

審查發(fā)現(xiàn)一共有三個異常值。第一個為TOTAL,很明顯不是一個人名,而且薪水和獎金都極度異常,我們將他作為真正的異常值刪除掉。

data_dict = dict(data_dict)data_dict.pop('TOTAL', '52')

剩下兩個分別是SKILLING JEFFREY K和LAY KENNETH L。他們分別是安然公司的CEO和董事長,他們是整個安然欺詐事件中最大的嫌疑犯。他們能有這么高的薪水和獎金也就不足為奇了。他們不是真的異常值,因此不對他們進(jìn)行處理。

優(yōu)化特征選擇

創(chuàng)建新的特征

我們有特征to_messages和from_poi_to_this_person這兩個特征,因此我想我們可以建立一個新的特征命名為 to_poi_ratio,其值為from_poi_to_this_person和to_messages的比值,比值越大也就意味著這個人收到的郵件中來自嫌疑人的郵件越多,往往也就意味著這個人和嫌疑人的關(guān)系越密切,很有可能這個人也是一個嫌疑人。具體創(chuàng)立代碼如下:

def poi_email_ratio(from_poi_to_this_person, to_messages):if from_poi_to_this_person or to_messages == 'NaN':to_poi_ratio = 0else:to_poi_ratio = float(from_poi_to_this_person)/to_messagesreturn to_poi_ratio# create new key and value for key in my_dataset:my_dataset[key]['to_poi_ratio'] = poi_email_ratio(my_dataset[key]['from_poi_to_this_person'], my_dataset[key]['to_messages'])

測試新特征是否會對分類算法的結(jié)果產(chǎn)生影響的代碼如下:

### 添加新特征之后的數(shù)據(jù)集 data = featureFormat(my_dataset, features_list, sort_keys = True) labels, features = targetFeatureSplit(data)### 未添加新特征的數(shù)據(jù)集 data = featureFormat(data_dict, features_list, sort_keys = True) labels, features = targetFeatureSplit(data)

我們分別運行這兩段代碼,比較結(jié)果就可以知道新特征是否會對分類算法產(chǎn)生影響了。運行結(jié)果分別如下:

### new feature The naive_bayes's recall is: 0.871794871795 The naive_bayes's precision is : 0.871794871795 The Decession_tree's recall is: 0.897435897436 The Decession_tree's precision is : 0.897435897436### orignal feature The naive_bayes's recall is: 0.871794871795 The naive_bayes's precision is : 0.871794871795 The Decession_tree's recall is: 0.846153846154 The Decession_tree's precision is : 0.846153846154

通過對比發(fā)現(xiàn)添加新特征對于樸素貝葉斯的結(jié)果完全沒有任何影響,而對于決策樹算法有一定影響。添加新特征之后決策樹算法的準(zhǔn)確率提高了。

選擇最佳特征

選擇和調(diào)整算法

選擇算法

我們這里郵件信息的學(xué)習(xí)過程實際上是一個監(jiān)督學(xué)習(xí)的過程,我們這里分別使用樸素貝葉斯和決策樹來對模型進(jìn)行訓(xùn)練和評估。因為這個數(shù)據(jù)集很不平衡(imbalance), 也就說明accuracy并不是很好的評估指標(biāo),因此我們選擇precision和recall來作為模型的評估指標(biāo)。

樸素貝葉斯的機器學(xué)習(xí)模型建立如下:

from sklearn.naive_bayes import GaussianNB clf = GaussianNB()clf.fit(features_train, labels_train) y_pred = clf.predict(features_test) recall = recall_score(labels_test, y_pred, average='micro') precision = precision_score(labels_test, y_pred, average='micro') print "The naive_bayes's recall is: %s " % recall print "The naive_bayes's precision is : %s" % precision

該模型預(yù)測的準(zhǔn)確率為0.85

決策樹的機器學(xué)習(xí)模型建立如下:

from sklearn import tree from sklearn.model_selection import GridSearchCV trees = tree.DecisionTreeClassifier() parameters = {'min_samples_split' : range(5,80,5), 'splitter' : ('best', 'random')}clf = GridSearchCV(trees, parameters) clf.fit(features_train, labels_train) y_pred = clf.predict(features_test) recall = recall_score(labels_test, y_pred, average='micro') precision = precision_score(labels_test, y_pred, average='micro') print "The Decession_tree's recall is: %s " % recall print "The Decession_tree's precision is : %s" % precision

決策樹訓(xùn)練模型涉及到較多的參數(shù),要想得到更好的訓(xùn)練效果,對于參數(shù)的調(diào)整是絕對必要的。

調(diào)整算法

使用決策樹有一個缺點就是容易過擬合,因此我們發(fā)應(yīng)當(dāng)盡可能的合理調(diào)整參數(shù)以達(dá)到最好的訓(xùn)練效果。

決策樹有一個參數(shù)為min_samples_split,用于設(shè)置最小分割數(shù)。另外我們還可以調(diào)整splitter參數(shù),該參數(shù)可以設(shè)置分割方法,有兩種:一種是’best’策略,用于選擇最好的分割,另一種是’random’策略,用于選擇最好的隨機分割。通常情況下當(dāng)樣本量比較小的時候我們采取’best’策略進(jìn)行分割,而當(dāng)樣本量比較大的時候,我們采取‘random’的效果會更好。

使用 GridSearchCV 進(jìn)行參數(shù)調(diào)整

GridSearchCV 用于系統(tǒng)地遍歷多種參數(shù)組合,通過交叉驗證確定最佳效果參數(shù)。它的好處是,只需增加幾行代碼,就能遍歷多種組合。當(dāng)然與此對應(yīng)的是機器學(xué)習(xí)過程所消耗的時間會相對較多。下面我們用GridSearchCV對決策樹參數(shù)進(jìn)行調(diào)整:

from sklearn import tree from sklearn.model_selection import GridSearchCV trees = tree.DecisionTreeClassifier() parameters = {'min_samples_split' : range(5,80,5), 'splitter' : ('best', 'random')}clf = GridSearchCV(trees, parameters) clf.fit(features_train, labels_train) print clf.score(features_test, labels_test)

經(jīng)測試發(fā)現(xiàn)準(zhǔn)確率為0.91,高于樸素貝葉斯的0.87。這里我們使用決策樹效果更好。

驗證和評估

我們分別使用精確度和召回率這兩個指標(biāo)來評估模型的好壞。精確度概括的說可以是:猜對真的/(猜對真的+誤以為真的)。召回率概括的說可以是猜對真的/(猜對真的+誤以為假的)。我們分別對兩個算法模型進(jìn)行評估

驗證及其重要性

驗證是用于評估模型好壞的一個重要方法,我們通常將數(shù)據(jù)集分為訓(xùn)練集和測試集就是為了驗證的方便。前者用以建立模型(model),后者則用來評估該模型對未知樣本進(jìn)行預(yù)測時的泛化能力。我們需要在測試集上進(jìn)行驗證,來確定訓(xùn)練集是否“過擬合”或者“欠擬合”。不同的數(shù)據(jù)集和訓(xùn)練集的劃分方法,也會對驗證的效果產(chǎn)生一定影響。

訓(xùn)練集和數(shù)據(jù)集的拆分

我使用如下方法拆分訓(xùn)練集和數(shù)據(jù)集的

from sklearn.model_selection import train_test_split features_train, features_test, labels_train, labels_test = train_test_split(features, labels, test_size=0.3, random_state=42)

數(shù)據(jù)集的70%作為訓(xùn)練集,30%作為測試集

參考資料

我在此確認(rèn),所提交的項目為我的工作成果,其中引用的信息出自網(wǎng)站、書籍、論壇、博客文章和 GitHub 代碼庫等。下面列出我在完成項目過程中所參考的資料:

Recall和Precision的理解 http://blog.csdn.net/Relocy/article/details/51453950

Precision-Recall metric: http://scikit-learn.org/stable/auto_examples/model_selection/plot_precision_recall.html

recall score :http://scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html

交叉驗證:http://blog.csdn.net/cherdw/article/details/54986863

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的机器学习安然数据集分析报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。