猿學-Python數據挖掘指南

1、數據挖掘和算法

數據挖掘是從大型數據庫的分析中發現預測信息的過程。對於數據科學家來說,數據挖掘可能是一項模糊而艱鉅的任務 - 它需要多種技能和許多數據挖掘技術知識來獲取原始數據併成功獲取數據。您需要了解統計學的基礎,以及可以幫助您大規模進行數據挖掘的不同編程語言。  

本指南將提供一個示例填充的使用Python的數據挖掘簡介,Python是最廣泛使用的數據挖掘工具之一 - 從清理和數據組織到應用機器學習算法。首先,讓我們更好地理解數據挖掘及其完成方式。

1.1、數據挖掘定義 

數據挖掘的期望結果是從給定數據集創建模型,該模型可以將其洞察力推廣到類似數據集。從銀行和信貸機構的自動欺詐檢測中可以看到成功的數據挖掘應用程序的真實示例。

如果您的銀行檢測到您的帳戶存在任何可疑活動,您的銀行可能會制定一項提醒您的政策 - 例如在您註冊的住所以外的州內重複提取ATM或大量購物。這與數據挖掘有何關係?數據科學家通過應用算法來創建該系統,通過將交易與欺詐性和非欺詐性收費的歷史模式進行比較,對交易​​是否具有欺詐性進行分類和預測。該模型“知道”如果你住在加利福尼亞州聖地亞哥,那麼向俄羅斯人口稀少的省份收取的數千美元購買的可能性很大。

這只是數據挖掘的衆多強大應用之一。數據挖掘的其他應用包括基因組測序,社交網絡分析或犯罪成像 - 但最常見的用例是分析消費者生命週期的各個方面。公司使用數據挖掘來發現消費者的偏好,根據他們的購買活動對不同的消費者進行分類,並確定對付高薪客戶的要求 - 這些信息可以對改善收入流和降低成本產生深遠影響。

如果您正在努力獲得良好的數據集以開始分析,我們爲您的第一個數據科學項目編譯了19個免費數據集

什麼是數據挖掘技術?

有多種方法可以從數據集構建預測模型,數據科學家應該瞭解這些技術背後的概念,以及如何使用代碼生成類似的模型和可視化。這些技術包括:

迴歸 - 通過優化誤差減少來估計變量之間的關係。

 

 

具有擬合線性迴歸模型的散點圖的示例

分類 - 識別對象所屬的類別。一個例子是將電子郵件分類爲垃圾郵件或合法郵件,或者查看某人的信用評分並批准或拒絕貸款請求。

聚類分析 - 根據數據的已知特徵查找數據對象的自然分組。在營銷中可以看到一個例子,其中分析可以揭示具有獨特行爲的客戶分組 - 這可以應用於業務戰略決策中。

 散點圖的示例,其中數據按羣集分段和着色

關聯和相關分析 - 尋找不明顯的變量之間是否存在唯一關係。一個例子就是着名的啤酒和尿布案例:在本週末購買紙尿褲的男性更有可能購買啤酒,因此商店將它們放在一起以增加銷量。

異常值分析 - 檢查異常值以檢查所述異常值的潛在原因和原因。其中一個例子是在欺詐檢測中使用離羣值分析,並試圖確定規範之外的行爲模式是否是欺詐。 

業務數據挖掘通常使用事務和實時數據庫執行,該數據庫允許輕鬆使用數據挖掘工具進行分析。其中一個例子是在線分析處理服務器或OLAP,它允許用戶在數據服務器內進行多維分析。OLAP允許企業查詢和分析數據,而無需下載靜態數據文件,這在數據庫日常增長的情況下很有用。但是,對於那些希望學習數據挖掘和自己練習的人來說,iPython筆記本 非常適合處理大多數數據挖掘任務。

讓我們來看看如何使用Python來使用上述兩種數據挖掘算法執行數據挖掘:迴歸和  聚類。


2、在Python中創建迴歸模型

我們想解決的問題是什麼?

我們想要建立變量之間線性關係的估計,打印相關係數,並繪製最佳擬合線。對於這個分析,我將使用來自Kaggle的King's County數據集中House Sales的數據。如果您對Kaggle不熟悉,那麼它是查找適合數據科學實踐的數據集的絕佳資源。King's County的數據包含有關房價和房屋特徵的信息 - 讓我們看看我們是否可以估算房價與房屋面積之間的關係。

第一步:爲工作提供合適的數據挖掘工具 - 安裝Jupyter,熟悉一些模塊。

首先,如果您想要跟隨,請在桌面上安裝Jupyter。它是一個免費的平臺,爲iPython筆記本(.ipynb文件)提供了一個非常直觀的處理器。請按照以下說明進行安裝。我在這裏所做的一切都將在Jupyter的“Python [Root]”文件中完成。 

我們將使用Python 的Pandas mo dule來清理和重構我們的數據。Pandas是一個開源模塊,用於處理數據結構和分析,這對於使用Python的數據科學家來說無處不在。它允許數據科學家以任何格式上傳數據,並提供一個簡單的平臺來組織,排序和操作該數據。如果這是您第一次使用Pandas,請查看有關基本功能的精彩教程

在[1]中:

導入 pandas  as  pd

In [1]:

import pandas as pd

import matplotlib.pyplot as plt

import numpy as np

import scipy.stats as stats

import seaborn as sns

from matplotlib import rcParams

 

%matplotlib inline

%pylab inline

從numpy和matplotlib填充交互式命名空間

在上面的代碼中,我導入了一些模塊,這裏是他們所做的細分:

Numpy - 科學計算的必要包。它包含一個非常通用的結構,用於處理數組,這是scikit-learn用於輸入數據的主要數據格式。

Matplotlib - Python中數據可視化的基礎包。該模塊允許創建從簡單的散點圖到三維等高線圖的所有內容。請注意,從matplotlib我們安裝pyplot,這是模塊層次結構中最高級的狀態機環境(如果這對你沒有任何意義,請不要擔心它,只需確保將它導入到你的筆記本中)。使用'%matplotlib inline'對於確保所有圖表都顯示在筆記本中至關重要。 

Scipy - python中統計工具的集合。Stats是導入迴歸分析函數的scipy模塊。

讓我們分解如何應用數據挖掘來逐步解決迴歸問題!在現實生活中,您很可能不會立即準備好應用機器學習技術的數據集,因此您需要首先清理和組織數據。

In [2]:

df = pd.read_csv('/Users/michaelrundell/Desktop/kc_house_data.csv')

df.head()

OUT [2]:

 

 

 

 

 

 

使用pandas(pd.read_csv)從Kaggle讀取csv文件。

In [3]:

df.isnull().any()

Out[3]:

id               False

date             False

price            False

bedrooms         False

bathrooms        False

sqft_living      False

sqft_lot         False

...

dtype: bool

 

Checking to see if any of our data has null values. If there were any, we’d drop or filter the null values out.

In [4]:

df.dtypes

Out[4]:

id                 int64

date              object

price            float64

bedrooms           int64

bathrooms        float64

sqft_living        int64

sqft_lot           int64

...

dtype: object

檢查每個變量的數據類型。我們想要了解數據是否是數字(int64,float64)或不是(對象)。 

我使用Pandas從csv文件導入了數據框,我做的第一件事是確保它正確讀取。我還使用了“isnull()”函數來確保我的數據都不能用於迴歸。在現實生活中,單個列可能具有整數,字符串或NaN形式的數據,所有這些都在一個地方 - 這意味着您需要檢查以確保類型匹配並且適合迴歸。這個數據集恰好已經非常嚴格地準備好了,你不會經常在自己的數據庫中看到這些數據集。 

下一篇:簡單的探索性分析和迴歸結果。

讓我們在進一步瞭解之前瞭解數據,重要的是要查看數據的形狀 - 並仔細檢查數據是否合理。損壞的數據並不罕見,因此最好始終運行兩項檢查:首先,使用df.describe()查看分析中的所有變量。其次,使用plt.pyplot.hist()繪製分析所針對的變量的直方圖。

In [5]:

df.describe()

out[5]:

 

價錢

臥室

浴室

sqft_living

計數

21613

21613

21613

21613

意思

540088.10

3.37

2.11

2079.90

STD

367127.20

0.93

0.77

918.44

75000.00

0.00

0.00

290.00

25%

321950.00

3.00

1.75

1427.00

50%

450000.00

3.00

2.25

1910.00

75%

645000.00

4.00

2.50

2550.00

最大

7700000.00

33.00

8.00

13540.00

快速消息:我們正在處理包含21,613個觀測資料的數據集,平均價格約爲$ 540k,中位數價格約爲$ 450k,而且平均房屋面積爲2080 ft 2

In [19]:

fig = plt.figure(figsize=(12, 6))

sqft = fig.add_subplot(121)

cost = fig.add_subplot(122)

 

sqft.hist(df.sqft_living, bins=80)

sqft.set_xlabel('Ft^2')

sqft.set_title("Histogram of House Square Footage")

 

cost.hist(df.price, bins=80)

cost.set_xlabel('Price ($)')

cost.set_title("Histogram of Housing Prices")

 

plt.show()

 

 

 

 

 

 

 

 

 

 

 

使用matplotlib(plt),我們打印了兩個直方圖,以觀察房價和平方英尺的分佈情況。我們發現兩個變量的分佈都是右傾的。
現在我們已經很好地瞭解了我們的數據集,並且知道了我們試圖測量的變量的分佈,讓我們做一些迴歸分析。首先,我們導入statsmodels以獲得最小二乘迴歸估計函數。在“普通最小二乘法”模塊會做大量的工作,當涉及到搗弄數字在Python中迴歸。

In [15]:

import statsmodels.api as sm

from statsmodels.formula.api import ols

  

當您使用只有兩個變量的OLS編碼生成線性迴歸摘要時,這將是您使用的公式:

Reg = ols('因變量〜自變量,數據幀).fit()

打印(Reg.summary())

當我們查看King's縣的房屋價格和房屋面積時,我們打印出以下摘要報告:

In [16]:

m = ols('price ~ sqft_living',df).fit()

print (m.summary())

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

警告:

[1]標準錯誤假設正確指定了錯誤的協方差矩陣。

[2]條件數很大,5.63e + 03。這可能表明存在

強多重共線性或其他數值問題。

簡單線性迴歸模型摘要輸出的示例。

當您打印OLS迴歸的摘要時,可以輕鬆找到所有相關信息,包括R平方,t統計量,標準誤差和相關係數。從產量來看,很明顯平方英尺和房價之間存在極其顯着的關係,因爲存在極高的t值144.920,並且  P> | t | 0% - 這實際上意味着這種關係由於統計變異或機會而幾乎爲零。

這種關係也有一個不錯的規模 - 每增加100平方英尺的房子,我們可以預測房子平均價格會高出28,000美元。可以很容易地調整此公式以包含多個自變量,只需遵循以下公式:

Reg = ols(‘Dependent variable ~ivar1 + ivar2 + ivar3… + ivarN, dataframe).fit()

print(Reg.summary())

In [26]:

m = ols('price ~ sqft_living + bedrooms + grade + condition',df).fit()

print (m.summary())

 

 

警告:

[1]標準錯誤假設正確指定了錯誤的協方差矩陣。

[2]條件數很大,2.5e + 04。這可能表明存在

強多重共線性或其他數值問題。

多元線性迴歸的一個例子。

在我們上面的多元迴歸輸出中,我們瞭解到通過使用額外的自變量,例如臥室的數量,我們可以提供更好地擬合數據的模型,因爲此迴歸的R平方已增加到0.555。這意味着我們能夠通過添加更多的自變量來解釋模型中49.3%的變異到55.5%。 

可視化迴歸結果:

使用迴歸彙總輸出對於檢查迴歸模型的準確性以及用於估計和預測的數據非常重要 - 但是可視化迴歸是以更易消化的格式傳達迴歸結果的重要步驟。

本節將完全依賴於Seaborn(sns),它具有非常簡單和直觀的功能,可以使用散點圖繪製迴歸線。我選擇爲平方英尺和價格創建一個聯合圖,顯示迴歸線以及每個變量的分佈圖。

In [24]:

sns.jointplot(x="sqft_living", y="price", data=df, kind = 'reg',fit_reg= True, size = 7)

plt.show()

/Users/michaelrundell/anaconda/lib/python3.5/site-packages/statsmodels/nonparametric/kdetools.py:20:VisibleDeprecationWarning:使用非整數而不是整數將導致將來出錯

y = X [:m / 2 + 1] + np.r_ [0,X [m / 2 + 1:],0] * 1j

 

 這包含了我的迴歸示例,但是在python中還有許多其他方法可以執行迴歸分析,尤其是在使用某些技術時。有關回歸模型的更多信息,請參閱以下資源。接下來我們將介紹集羣分析。

使用Seaborn可視化線性關係 - 本文檔提供了具體示例,說明如何修改迴歸圖,並顯示您可能不知道如何自行編碼的新功能。它還教你如何適應不同類型的模型,如二次或邏輯模型。
Python中的統計信息 - 本教程介紹了在python中執行迴歸的不同技術,還將教您如何進行假設測試和交互測試。

如果您想了解更多可幫助您可視化結果的數據挖掘軟件,您應該查看 我們編譯的這31個免費數據可視化工具

3、在Python中創建聚類模型

我們希望爲一組數據對象創建自然分組,這些數據對象可能未在數據本身中明確說明。我們的分析將使用黃石公園着名間歇泉Old Faithful噴發的數據。Barney Govan 從這個Github存儲庫中找到了這些數據。它只包含兩個屬性,即噴發(分鐘)和噴發長度(分鐘)之間的等待時間。只有兩個屬性可以很容易地創建一個簡單的k-means集羣模型。

什麼是k-means集羣模型?

K-Means Cluster模型以下列方式工作 - 所有這些博客都歸功於此:

(1)、從一組隨機選擇的k個質心(k個簇的假定中心)開始

(2)、根據最接近的質心確定哪個觀測點在哪個羣集中(使用平方歐幾里德距離:Σpj= 1(xij-xi'j)2其中p是維數。

(3)、通過最小化與羣集中每個觀察的平方歐幾里德距離來重新計算每個羣集的質心

(4)、重複2.和3.直到簇的成員(以及因此質心的位置)不再改變。

(5)、如果這仍然令人困惑,請查看Jigsaw Academy的這段有用的視頻。現在,讓我們繼續將此技術應用於我們的Old Faithful數據集。

第一步:探索性數據分析

您需要安裝一些模塊,包括一個名爲Sci-kit Learn新模塊- 用於Python中機器學習和數據挖掘的工具集(閱讀我們使用Sci-kit進行神經網絡模型的教程)。Cluster是sci-kit模塊,它使用聚類算法導入函數,因此從sci-kit導入它。

首先,讓我們將所有必要的模塊導入我們的iPython Notebook並進行一些探索性數據分析

In [18]:

import pandas as pd

import numpy as np

import matplotlib

import matplotlib.pyplot as plt

 

import sklearn

from sklearn import cluster

 

%matplotlib inline

 

faithful = pd.read_csv('/Users/michaelrundell/Desktop/faithful.csv')

faithful.head()

out[18]:

 

爆發

等候

0

3.600

79

1

1.800

54

2

3.333

74

3

2.283

62

4

4.533

85

閱讀舊的忠實csv並導入所有必要的值

我所做的就是從本地目錄中讀取csv,這恰好是我計算機的桌面,並顯示了數據的前5個條目。幸運的是,我知道這個數據集沒有缺少或NaN值的列,因此我們可以跳過此示例中的數據清理部分。我們來看一下數據的基本散點圖。

In [19]:

faithful.columns = ['eruptions', 'waiting']

 

plt.scatter(faithful.eruptions, faithful.waiting)

plt.title('Old Faithful Data Scatterplot')

plt.xlabel('Length of eruption (minutes)')

plt.ylabel('Time between eruptions (minutes)')

 

Out[19]:

<matplotlib.text.Text at 0x12a29bba8>

 

 重命名列並使用matplotlib創建一個簡單的散點圖

關於我的過程的一些快速說明:我重新命名了列 - 它們與肉眼看起來沒什麼不同,但是“等待”列在單詞之前有一個額外的空間,並且爲了防止與進一步分析混淆我更改了它確保我不會忘記或在路上犯任何錯誤。  

第二步:構建集羣模型

我們看到的是散點圖,其中有兩個很容易明顯的聚類,但數據集並未將任何觀察標記爲屬於任何一個組。接下來的幾個步驟將涵蓋視覺上區分兩組的過程。在下面的代碼中,我建立了一些重要的變量並改變了數據的格式。

In [20]:

faith = np.array(faithful)

 

k = 2

kmeans = cluster.KMeans(n_clusters=k)

kmeans.fit(faith)

 

labels = kmeans.labels_

centroids = kmeans.cluster_centers_

格式化和功能創建:

1、我將忠實的數據幀讀作一個numpy數組,以便sci-kit能夠讀取數據。

2、選擇K = 2作爲簇的數量,因爲我們正在嘗試創建2個明確的分組。

3、'kmeans'變量由sci-kit中的集羣模塊調用的輸出定義。我們採用了K個簇,並將數據擬合到數組'faith'中。

現在我們已經設置了用於創建集羣模型的變量,讓我們創建一個可視化。下面的代碼將繪製按簇顏色的散點圖,並給出最終的質心位置。具體的代碼行的說明可以在下面找到。

In [21]:

for i in range(k):

    # select only data observations with cluster label == i

    ds = faith[np.where(labels==i)]

    # plot the data observations

    plt.plot(ds[:,0],ds[:,1],'o', markersize=7)

    # plot the centroids

    lines = plt.plot(centroids[i,0],centroids[i,1],'kx')

    # make the centroid x's bigger

    plt.setp(lines,ms=15.0)

    plt.setp(lines,mew=4.0)

plt.show()

 

創建羣集模型的可視化

快速細分上面的代碼:

1、將數據分組爲2組的所有工作都在上一段代碼中完成,我們使用命令kmeans.fit(faith)。代碼的這一部分只是創建了顯示它的圖。

2、ds變量只是原始數據,但重新格式化爲包含基於組數的新顏色標籤 - k中的整數數。

3、plt.plot調用x數據,y數據,對象的形狀和圓的大小。

4、其餘代碼顯示k-means聚類過程的最終質心,並控制質心標記的大小和厚度。

在這裏我們擁有它 - 一個簡單的集羣模型。此代碼適用於包含不同數量的羣集,但對於此問題,僅包含2個羣集是有意義的。現在我們已經將這些聚類看起來很好地定義了,我們可以從這兩個聚類中推斷出意義。他們代表什麼?綠色集羣:主要由火山爆發組成,火山爆發之間的短暫等待時間可以定義爲“弱火或快速射擊”,而藍色火星羣可以稱爲“火力爆發”。

值得注意的是:這種技術不適用於所有數據集 - 數據科學家David Robinson 在他的文章完美地解釋了K-means聚類“不是免費的午餐”。如果您的數據具有不均勻的聚類概率,K-means的假設會失敗(它們在每個簇中沒有大致相同的觀察量),或者具有非球形簇。如果您認爲您的羣集問題不適用於K-means羣集,請查看有關替代羣集建模技術的這些資源:

Sci-kit羣集模塊 - 此文檔有一個漂亮的圖像,可以直觀地比較scikit-learn中的聚類算法,因爲它們會查找不同的散點圖。如果您有一個類似於其中一個示例的散點圖,則使用此文檔可以指向正確的算法。它還爲您提供了有關如何以數學方式評估聚類模型的一些見解。

聚類算法 - 這個來自斯坦福大學CS345課程的Powerpoint演示文稿,數據挖掘,可以深入瞭解不同的技術 - 它們如何工作,有效和無效等等。它是理解聚類在理論層面如何工作的一個很好的學習資源。


 

結論

數據挖掘包含許多預測建模技術,您可以使用各種數據挖掘軟件。要學習使用Python來應用這些技術是很困難的 - 將練習和勤奮應用到您自己的數據集上是很困難的。在早期,您將遇到無數的錯誤,錯誤消息和包版廣告。 - 但在數據挖掘嘗試中保持持久和勤奮。我希望通過查看上面的集羣和線性迴歸模型的代碼和創建過程,您已經瞭解到數據挖掘是可以實現的,並且可以使用有效數量的代碼完成。

猿學-中國互聯網IT軟件培訓專家!承接電信、能源、金融、政府、製造業、商貿流通業、醫療衛生、教育與文化、交通、移動互聯網、傳媒、環保等軟件項目合作,歡迎洽談!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章