1. 程式人生 > >機器學習安然資料集分析報告

機器學習安然資料集分析報告

專案背景

安然曾是 2000 年美國最大的公司之一。輝煌時期,市值高達700億美元。2002 年,由於其存在大量的企業欺詐行為,這個昔日的大集團以極快的速度土崩瓦解。 在隨後聯邦進行的調查過程中,大量有代表性的保密資訊進入了公眾的視線,包括成千上萬涉及高管的郵件和詳細的財務資料。 你將在此專案中扮演偵探,運用你的新技能,根據安然醜聞中公開的財務和郵件資料來構建相關人士識別符。利用機器學習演算法進行資料分析,從郵件和財務資料中找出犯罪嫌疑人。

資料集初步探索

載入資料集

首先我們載入資料集

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

電子郵件和財務 (E+F) 資料字典被儲存在 pickle 檔案中,該檔案可直接儲存和載入 python 物件,非常方便。

資料集初步分析

分析發現我們讀取的資料資料實際上是以字典形式進行。隨機取一個字典,其儲存結構如下所示:

{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': '
[email protected]
', 'from_poi_to_this_person': 38}}

在預處理此專案時,我們已將安然郵件和財務資料與字典結合在一起,字典中的每對鍵值對應一個人。 字典鍵是人名,值是另一個字典(包含此人的所有特徵名和對應的值)。 資料中的特徵分為三大類,即財務特徵、郵件特徵和 POI 標籤。

財務特徵 : [‘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’] (單位通常是電子郵件的數量,明顯的例外是 ‘email_address’,這是一個字串)

POI 標籤 : [‘poi’] (boolean,整數)

資料特徵

分析這個資料字典,我們發現每個人一共有20個特徵可以用於分析,其中的poi不是特徵,而是label/target

資料點總數

分析整個資料字典,我們發現一共有146個數據點(人)。

POI統計

POI( Person of interest )是嫌疑犯的意思,資料集有一個標籤(label)就是嫌疑犯,所以我們只需要統計
data_dict[preson name][‘poi’] == 1
的數量就可以了。

統計發現有18個。

缺失的特徵

資料集並不是每個特徵後都有明確的值,有很多資訊的特徵是缺失的。對於salary特徵,很多人的資訊就是NaN。146個數據點(人)中,只有95個人有salary的具體資訊。有111個人有郵箱地址,其他人的郵箱地址資訊為NaN。

異常值調查和處理

我們在分析財務資料salary和bounds之間的關係時發現了一個極為異常額異常值,如下圖所示

這裡寫圖片描述

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

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']

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

data_dict = dict(data_dict)

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

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

優化特徵選擇

建立新的特徵

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

def poi_email_ratio(from_poi_to_this_person, to_messages):
    if from_poi_to_this_person or to_messages == 'NaN':
        to_poi_ratio = 0
    else:
        to_poi_ratio = float(from_poi_to_this_person)/to_messages
    return 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'])

測試新特徵是否會對分類演算法的結果產生影響的程式碼如下:


### 新增新特徵之後的資料集
data = featureFormat(my_dataset, features_list, sort_keys = True)
labels, features = targetFeatureSplit(data)

### 未新增新特徵的資料集
data = featureFormat(data_dict, features_list, sort_keys = True)
labels, features = targetFeatureSplit(data)

我們分別執行這兩段程式碼,比較結果就可以知道新特徵是否會對分類演算法產生影響了。執行結果分別如下:

### 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

通過對比發現新增新特徵對於樸素貝葉斯的結果完全沒有任何影響,而對於決策樹演算法有一定影響。新增新特徵之後決策樹演算法的準確率提高了。

選擇最佳特徵

選擇和調整演算法

選擇演算法

我們這裡郵件資訊的學習過程實際上是一個監督學習的過程,我們這裡分別使用樸素貝葉斯和決策樹來對模型進行訓練和評估。因為這個資料集很不平衡(imbalance), 也就說明accuracy並不是很好的評估指標,因此我們選擇precision和recall來作為模型的評估指標。

樸素貝葉斯的機器學習模型建立如下:

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

該模型預測的準確率為0.85

決策樹的機器學習模型建立如下:

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

決策樹訓練模型涉及到較多的引數,要想得到更好的訓練效果,對於引數的調整是絕對必要的。

調整演算法

使用決策樹有一個缺點就是容易過擬合,因此我們發應當儘可能的合理調整引數以達到最好的訓練效果。

決策樹有一個引數為min_samples_split,用於設定最小分割數。另外我們還可以調整splitter引數,該引數可以設定分割方法,有兩種:一種是’best’策略,用於選擇最好的分割,另一種是’random’策略,用於選擇最好的隨機分割。通常情況下當樣本量比較小的時候我們採取’best’策略進行分割,而當樣本量比較大的時候,我們採取‘random’的效果會更好。

使用 GridSearchCV 進行引數調整

GridSearchCV 用於系統地遍歷多種引數組合,通過交叉驗證確定最佳效果引數。它的好處是,只需增加幾行程式碼,就能遍歷多種組合。當然與此對應的是機器學習過程所消耗的時間會相對較多。下面我們用GridSearchCV對決策樹引數進行調整:

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)

經測試發現準確率為0.91,高於樸素貝葉斯的0.87。這裡我們使用決策樹效果更好。

驗證和評估

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

驗證及其重要性

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

訓練集和資料集的拆分

我使用如下方法拆分訓練集和資料集的

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)

資料集的70%作為訓練集,30%作為測試集

更多精彩內容,歡迎關注我的微信公眾號:資料瞎分析

在這裡插入圖片描述

參考資料

我在此確認,所提交的專案為我的工作成果,其中引用的資訊出自網站、書籍、論壇、部落格文章和 GitHub 程式碼庫等。下面列出我在完成專案過程中所參考的資料:

相關推薦

機器學習安然資料分析報告

專案背景 安然曾是 2000 年美國最大的公司之一。輝煌時期,市值高達700億美元。2002 年,由於其存在大量的企業欺詐行為,這個昔日的大集團以極快的速度土崩瓦解。 在隨後聯邦進行的調查過程中,大量有代表性的保密資訊進入了公眾的視線,包括成千上萬涉及高管的郵件

最強資料集合:50個最佳機器學習公共資料丨資源

原作 mlmemoirs 郭一璞 編譯 量子位 報道 | 公眾號 QbitAI 外國自媒體mlmemoirs根據github、福布斯、CMU官網等資訊,整理了一張50個最佳機器學習公共資料集的榜單,量子位為大家分享一下~ 提前說兩個須知: 尋找資料集の奧義

最佳機器學習公共資料

一、去哪裡找資料集 Kaggle:愛競賽的盆友們應該很熟悉了,Kaggle上有各種有趣的資料集,拉麵評級、籃球資料、甚至西雅圖的寵物許可證。 https://www.kaggle.com/ UCI機器學習庫:最古老的資料集源之一,是尋找有趣資料集的第一站。雖然

機器學習資料切分

機器學習之資料集切分 # -*- coding: utf-8 -*- """ Created on Mon Dec 10 09:32:55 2018 @author: muli """ from sklearn.model_selection import trai

【Mark Schmidt課件】機器學習資料探勘——主元分析PCA

本課件主要內容包括: 上次課程回顧:MAP估計 人類 vs. 機器感知 隱因子模型 向量量化 向量量化 vs. PCA 主元分析PCA的應用 PCA目標函式 英文原文課件下載地址: h

最強資料50個最佳機器學習公共資料,可以幫你驗證idea!

1.  尋找資料集の奧義 根據CMU的說法,尋找一個好用的資料集需要注意一下幾點: 資料集不混亂,否則要花費大量時間來清理資料。 資料集不應包含太多行或列,否則會難以使用。 資料越乾淨越好,清理大型資料集可能非常耗時。 應該預設一個有趣的問題,而這個問題又可以用資料來

機器學習、深度學習開源資料分享

轉自:機器學習演算法與Python學習 機器學習演算法與Python學習 微訊號guodongwei1991 功能介紹作為溝通學習的平臺,釋出機器學習與資料探勘、深度學習、Python實戰的前沿與動態,歡迎機器學習愛好者的加入,希望幫助你在AI領域更好的發展,期待與你相遇! 今天

《人工智慧+機器學習+機器人資料大合

資料下載連結: 一、引言 本次把電腦裡邊的資料整理了一下,供大家學習交流。整理的書本涵蓋人工智慧+機器學習+機器人方面,列表如下: 0-機器學習實戰+程式碼 0.1-Python3.6 中文文件.pdf 0.2-Python程式設計:從入門到實踐_2016.7.

機器學習資料分析王者 CatBoost vs. Light GBM vs. XGBoost

機器學習領域的一個特點就是日新月異,在資料競賽中,一件趁手的工具對比賽結果有重要影響。boosting是一種將弱分類器組合成強分類器的方法,它包含多種演算法,如GDBT、AdaBoost、XGBoost等等。如果你參加過Kaggle之類的資料競賽,你可能聽說過XGBoost在

《R語言實戰——機器學習資料分析

概率統計基礎知識要點: 樣本空間:由隨機試驗E的全部可能結果所組成的集合被稱為E的樣本空間S。 隨機變數Random Variable:是定義在樣本空間S之上的實驗結果的實值函式X。 離散型隨機變數:如果一個隨機變數最多有可數多個可能取值。 連續型隨機變數:如果隨機變數取值

機器學習資料訓練,測試劃分與交叉驗證的聯絡與區別(含程式)

因為一個模型僅僅重複了剛剛訓練過的樣本的標籤,這種情況下得分會很高,但是遇到沒有訓練過的樣本就無法預測了。這種情況叫做過擬合。為了避免過擬合,一個常見的做法就是在進行一個(有監督的)機器學習實驗時,保留

機器學習定義、機器學習資料建模、分析的區別

一、什麼是機器學習? 先來看一則開場白: 看完這段話,可以發現這裡涉及了很多基於“經驗”而做出的判斷。換句話說就是:通過對經驗的利用,就能對新的情況做出有效的決策。 ** 機器學習定義是什麼呢: **筆者摘錄了兩則,大家批評接受 —>①

Python資料分析機器學習-Python時間序列分析

原始碼下載地址: http://download.csdn.net/download/adam_zs/10224873 from __future__ import absolute_import, division, print_function # http://w

《R語言實戰——機器學習資料分析》讀書筆記

#程式功能:測試《R語言實戰——機器學習與資料分析》中的示例 #呼叫方法:R控制檯輸入:source("D:/xxx/R/test.R") #設定工作目錄,每次退出後再進都需要重新設定 setwd("d:/xxx/R") #讀入文字檔案格式的資料 # data <-

機器學習探索性資料分析資料型別(補充)

探索性資料分析(Exploratory Data Analysis, EDA ) EDA是指對已有的資料(特別是調查或觀察得來的原始資料)在儘量少的先驗假定下進行探索,通過作圖、製表、方程擬合、計算特

資料機器學習 基礎篇 關聯分析

關聯規則是人類在認識客觀事物中形成的一種認知模式。這種關聯規則在人的認知裡與反射類似。如在小時候不小心被針扎到,會有痛感,這樣針刺和痛感就在大腦裡有了這種關聯。這就是人在認識事物的過程中在認知中所建立的關聯規則,即通過與客觀事件互動發現事物之間存在的依賴或因果關

機器學習資料降維—主成分分析(PCA)

本文程式碼推薦使用Jupyter notebook跑,這樣得到的結果更為直觀。 主成分分析(PCA) 特徵抽取通常用於提高計算效率,降低維度災難。 主成分分析(Principe component analysis,PCA):        是一種廣泛應用於不同領域的無監督

機器學習資料降維—線性判別分析(LDA)

本文程式碼推薦使用Jupyter notebook跑,這樣得到的結果更為直觀。 線性判別分析(Linear Discriminant Analysis,LDA)是一種可作為特徵抽取的技術 LDA可以提

機器學習:線性判別式分析(LDA)

get generated 分類 learn 參數 關註 ble 直線 圖片 1.概述 線性判別式分析(Linear Discriminant Analysis),簡稱為LDA。也稱為Fisher線性判別(Fisher Linear Disc

機器學習】主成分分析PCA(Principal components analysis)

大小 限制 總結 情況 pca 空間 會有 ges nal 1. 問題 真實的訓練數據總是存在各種各樣的問題:  1、 比如拿到一個汽車的樣本,裏面既有以“千米/每小時”度量的最大速度特征,也有“英裏/小時”的最大速度特征,