天天看點

Python資料挖掘——概要

一、資料挖掘過程

1.資料選擇

分析業務需求後,選擇應用于需求業務相關的資料:業務原始資料、公開的資料集、也可通過爬蟲采集網站結構化的資料。明确業務需求并選擇好針對性的資料是資料挖掘的先決條件。

2.資料預處理

通常選擇好的資料會有噪音,不完整等缺陷,需要對資料進行清洗,缺失項處理,內建,轉換以及歸納:

python字元串處理(相當友善)、正則式比對、pandas、beautifulsoup處理Html标簽等等工具。

3.特征工程/資料轉換

根據選擇的算法,對預處理好的資料提取特征,并轉換為特定資料挖掘算法的分析模型。

4.資料挖掘

使用選擇好的資料挖掘算法對資料進行處理後得到資訊。

5.解釋與評價

對資料挖掘後的資訊加以分析解釋,并應用于實際的工作領域。

二、資料挖掘常用算法簡介

1.關聯分析算法

關聯規則在于找出具有最小支援度門檻值和最小置信度門檻值的不同域的資料之間的關聯。在關聯規則的分析算法研究中,算法的效率是核心的問題。

經典的算法有:Apriori算法,AprioriTid算法,FP-growth算法;

2.分類算法

決策樹算法:以樹形結構表示分類或者決策集合,産生規則或者發現規律。主要有ID3算法,C4.5算法, SLIQ算法, SPRINT算法, RainForest算法;

樸素Bayes分類算法:利用Bayes定理機率統計的方法,選擇其中機率比較大的類别進行分類;

CBA(Classification Based on Association)算法:基于關聯規則的分類算法;

MIND(Mining in Database)算法 :采用資料庫中使用者定義的函數(user-definedfunction,簡稱UDF)來實作分類的算法;

神經網絡分類算法:利用訓練集對多個神經的網絡進行訓練,并用訓練好的模型對樣本進行分類;

粗集理論:粗集理論的特點是不需要預先給定某些特征或屬性的數量描述,而是直接從給定問題出發,通過不可分辨關系和不可分辨類确定問題的近似域,進而找出問題中的内在規律;

遺傳算法:遺傳算法是模拟生物進化過程,利用複制(選擇)、交叉(重組)和變異(突變)3個基本方法優化求解的技術;

3.聚類算法

聚類分析與分類不同,聚類分析處理的資料對象的類是未知的。聚類分析就是将對象集合分組為由類似的對象組成 的多個簇的過程。分為3類方法:

Ipartitioning method(劃分方法) 給定1個N個對象或者元組的資料庫,1個劃分方法建構資料的K個劃分,每1個劃分表示1個聚簇,并且K<N。經典算法是K-MEAN(K平均值);

hierarchical method(層次方法)

對給定資料對象集合進行層次的分解,經典算法是BIRTH算法;

grid based method(基于網格的方法) 這種方法采用一個多分辨率的網格資料結構。将空間量化為有限數目的單元,這些單元形成了網格結構,所有聚類分析都在網格上進行。常用的算法有STING,SkWAVECLUSTER和 CLIQUE;

小結

随着資料量的日益積累以及資料庫種類的多樣化,各種資料挖掘方法作用範圍有限,都有局限性,是以采用單一方法難以得到決策所需的各種知識。但它們的有機組合具有互補性,多方法融合将成為資料挖掘算法的發展趨勢。

三、資料挖掘算法實作

1、相關知識

(1)距離度量:在資料挖掘中需要明确樣本資料相似度,通常可以計算樣本間的距離,如下為常用距離度量的介紹。

樣本資料以:

Python資料挖掘——概要
Python資料挖掘——概要

曼哈頓距離: 也稱曼哈頓街區距離,就如從街區的一個十字路口點到另一個十字路口點的距離,

二維空間(多元空間按同理擴充)用公式表示為

Python資料挖掘——概要
Python資料挖掘——概要

歐氏距離:表示為點到點的距離。二維空間(多元空間按同理擴充)的公式表示為

Python資料挖掘——概要
Python資料挖掘——概要

闵可夫斯基距離:是一組距離方法的概括,當 p=1 既是曼哈頓距離,當 p=2 既是歐氏距離。當p越大,單一次元的內插補點對整體的影響就越大。

Python資料挖掘——概要

闵可夫斯基距離(包括歐氏距離,曼哈頓距離)的優缺點:

優點:應用廣泛。

缺點:無法考慮各分量的機關以及各分量分布(方差,期望)的差異性。(其中個分量的機關差異可以使用資料的标準化來消除,下面會有介紹。)

餘弦相關系數:樣本資料視為向量,通過兩向量間的夾角餘弦值确認相關性,數值範圍[-1,1]。 -1表示負相關,0表示無關,1表示正相關。

Python資料挖掘——概要

餘弦相關系數的優缺點:

優點:餘弦相似度與向量的幅值無關,隻與向量的方向相關,在文檔相似度(TF-IDF)和圖檔相似性(histogram)計算上都有它的身影;

而且在樣本數值稀疏的時候仍可以使用。

缺點:餘弦相似度受到向量的平移影響,上式如果将 x 平移到 x+1, 餘弦值就會改變。(可以了解為受樣本的起始标準的影響,接下來介紹的皮爾遜相關系數可以消除這個影響)

皮爾遜相關系數:計算出了樣本向量間的相關性,數值範圍[-1,1]。

Python資料挖掘——概要

考慮計算的周遊的次數,有一個替代公式可以近似計算皮爾遜相關系數:

Python資料挖掘——概要

皮爾遜相關系數優點:可消除每個分量标準不同(分數膨脹)的影響,具有平移不變性和尺度不變性。

(2)資料标準化:參考文章

各分量計算距離而各分量的機關尺度差異很大,可以使用資料标準化消除不同分量間機關尺度的影響,,加速模型收斂的效率,常用的方法有三種:

min-max 标準化:将數值範圍縮放到(0,1),但沒有改變資料分布。max為樣本最大值,min為樣本最小值。

Python資料挖掘——概要

z-score 标準化:将數值範圍縮放到0附近, 經過處理的資料符合标準正态分布。u是平均值,σ是标準差。

Python資料挖掘——概要

修正的标準z-score:修正後可以減少樣本資料異常值的影響。将z-score标準化公式中的均值改為中位數,将标準差改為絕對偏差。

Python資料挖掘——概要

其中asd絕對偏差:u為中位數,card(x)為樣本個數

Python資料挖掘——概要

(3) 算法的效果評估:

十折交叉驗證:将資料集随機分割成十個等份,每次用9份資料做訓練集,1份資料做測試集,如此疊代10次。十折交叉驗證的關鍵在于較平均地分為10份。

N折交叉驗證又稱為留一法:用幾乎所有的資料進行訓練,然後留一個資料進行測試,并疊代每一資料測試。留一法的優點是:确定性。

2、協同過濾推薦算法

代碼實作、資料集及參考論文 電影推薦——基于使用者、物品的協同過濾算法

...
示例:
r = Recommendor()

print("items base協同推薦 slope one")
#items base協同推薦算法 Slope one
r.slope_one_recommendation('lyy')

print("items base協同推薦 cos")
#items base協同推薦算法  修正餘弦相似度 
r.cos_recommendation('lyy')

print("users base協同推薦")
#userbase協同推薦算法 
r.user_base_recommendation("lyy")
           

(1)基于使用者的協同推薦算法

這個方法是利用相似使用者的喜好來進行推薦:如果要推薦一個樂隊給你,會查找一個和你類似的使用者,然後将他喜歡的樂隊推薦給你。

算法的關鍵在于找到相似的使用者,疊代計算你與每個使用者對相同樂隊的評分距離,來确定誰是你最相似的使用者,距離計算可以用曼哈頓距離,皮爾斯相關系數等等。

Python資料挖掘——概要

基于使用者的協同推薦算法算法的缺點:

擴充性:随着使用者數量的增加,其計算量也會增加。這種算法在隻有幾千個使用者的情況下能夠工作得很好,但達到一百萬個使用者時就會出現瓶頸。稀疏性:大多數推薦系統中,物品的數量要遠大于使用者的數量,是以使用者僅僅對一小部分物品進行了評價,這就造成了資料的稀疏性。比如亞馬遜有上百萬本書,但使用者隻評論了很少一部分,于是就很難找到兩個相似的使用者了。

(2)基于物品的協同推薦算法

基于使用者的協同過濾是通過計算使用者之間的距離找出最相似的使用者(需要将所有的評價資料在讀取在記憶體中處理進行推薦),并将相似使用者評價過的物品推薦給目标使用者。而基于物品的協同過濾則是找出最相似的物品(通過建構一個物品的相似度模型來做推薦),再結合使用者的評價來給出推薦結果。

基于物品的協同推薦算法常用有如下兩種:

修正餘弦相似度算法:

以物品的評分作為物品的屬性值,通過對比物品i,j的工有的使用者相對評分的計算相關性s(i,j)。與皮爾遜相關系數的原理相同,共有使用者對物品的每一評分R(u,j),R(u,i)需要減去該使用者評分的平均值R(`u)而消除分數膨脹。

Python資料挖掘——概要

修正餘弦相似度的優點:通過建構物品模型的方式,擴充性好,占用記憶體小;消除分數膨脹的影響;

修正餘弦相似度的缺點:稀疏性,需要基于使用者的評分資料;

Slope One推薦算法:

第一步,計算平均內插補點:

dev(i,j)為周遊所有共有物品i,j的共有使用者u的評分平均差異。

card(Sj,i(X))則表示同時評價過物品j和i的使用者數。

Python資料挖掘——概要

第二歩,使用權重的Slope One算法:

PWS1(u)j表示我們将預測使用者u對物品j的評分。

求合集i屬于S(u)-j,使用者u所含的所有物品i(除了j以外)。

dev(i,j)為周遊所有共有物品i,j的共有使用者u的評分平均差異。

C(ji)也就是card(Sj,i(X))表示同時評價過物品j和i的使用者數。

Python資料挖掘——概要

Slope One算法優點:算法簡單;擴充性好,隻需要更新共有屬性的使用者評價,而不需要重新載入整個資料集。

Slope One算法的缺點:稀疏性,需要基于使用者的評分資料;

3、分類算法

(1)基于物品特征值的KNN分類算法

代碼實作 鸢尾花KNN分類算法

...

 # KNN算法
    def knn(self, oj_list):
        weight_dict = {"Iris-setosa":0.0, "Iris-versicolor":0.0, "Iris-virginica":0.0}
        for atuple in oj_list:
            weight_dict[atuple[1]] += (1.0 / atuple[0])
        rel_class = [(key, value) for key, value in weight_dict.items()]
        #print(sorted(rel_class, key=lambda x:x[1], reverse=True))
        rel_class = sorted(rel_class, key=lambda x:x[1], reverse=True)[0][0]
        return rel_class
        
...
           

前面我們讨論的協同推薦算法需要在使用者産生的各種資料上面進行分析,是以也稱為社會化過濾算法,而這種算法通常有資料的稀疏性,算法可擴充性以及依賴于使用者的資料的缺點,而基于物品特征值分類算法可以改善這些問題。算法分為兩步:

第一步、選取特征值

算法的關鍵在于挑取有代表區分意義的特征及分值。以Iris花的示例,選取花萼長度, 花萼寬度,花瓣長度,花瓣寬度特征值。

Python資料挖掘——概要

第二歩、計算距離

比如計算測試集與訓練集特征值之間的曼哈頓距離,得到k個最近鄰後并通過權重後的結果預測分類。

KNN分類算法的缺點:無法對分類結果的置信度進行量化;是被動學習的算法,每次測試需要需要周遊所有的訓練集後才能分類。

(2)貝葉斯分類算法

代碼實作 區分新聞類别樸素貝葉斯分類算法

...
def train_data(self):
        #訓練組的條件機率
        for word in self.vocabulary:
            for category,value in self.prob.items():
                if word not in self.prob[category]:
                    count = 0
                else :
                    count = self.prob[category][word]
                #優化條件機率公式
                self.prob[category][word] = (count + 1) / (self.total[category] + len(self.vocabulary)) 
                
...
           

貝葉斯分類算法是基于機率的分類算法。相比于KNN分類算法,它是主動學習的算法,它會根據訓練集建立一個模型,并用這個模型對新樣本進行分類,速度也會快很多。

貝葉斯分類算法的理論基礎是基于條件機率的公式(應用于現實中P(X|Y&Z)不直覺得出,而P(Y|X)*P(Z|X)比較直覺得出),并假設已存在的子事件(y,z…實際應用中會有多個)間是互相獨立的(是以也稱為樸素貝葉斯),當y,z事件假設為獨立便有:

Python資料挖掘——概要

如下舉例推測買牛奶和有機食品,再會買綠茶的機率:

Python資料挖掘——概要

第一步:計算先驗機率及條件機率

先驗機率:為單獨事件發生的機率,如P(買綠茶),P(有機食品)

條件機率(後驗機率):y事件已經發生,觀察y資料集後得出x發生的機率。如P(買有機食品|買綠茶),通過以下公式計算(nc表示y資料集下x的發生頻數,n為y資料集的總數):

Python資料挖掘——概要

上式存在一個缺陷,當一個條件機率 P(y|x)為0時,整體的預測結果P(x) P(y|x) P(z|x)隻能為0,這樣便不能更全面地預測。

修正後的條件機率:(公式摘自Tom Mitchell《機器學習》。m是一個常數,表示等效樣本大小。決定常數m的方法有很多,我們這裡可以使用預測結果的類别來作為m,比如投票有贊成和否決兩種類别,是以m就為2。p則是相應的先驗機率,比如說贊成機率是0.5,那p(贊成)就是0.5。):

Python資料挖掘——概要

第二歩:根據貝葉斯公式做出預測

Python資料挖掘——概要

由公式計算比較y&z事件發生下,不同x事件發生的機率差異,如得出P(x=喜歡),P(x=不喜歡) 的機率大小,預測為機率比較大的事件。

因為P(y)*p(z)在上式都一樣,是以公式可以簡化為計算機率最大項而預測分類:

Python資料挖掘——概要

貝葉斯算法的優點:能夠給出分類結果的置信度;它是一種主動學習算法,速度更快。

貝葉斯算法的缺點:需要特定格式;數值型資料需要轉換為類别計算機率或用高斯分布計算機率;

(2)邏輯回歸分類算法

代碼實作 區分貓的圖檔

注:邏輯回歸分類算法待後續加入網絡層,更新為神經網絡分類算法。

...
# cost函數,計算梯度
def propagate(w, b, X, Y):
    m = X.shape[1]      
    A = sigmoid(np.dot(w.T, X) + b)            
    cost = -1 / m * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))        
    dw = 1 / m * np.dot(X, (A - Y).T)  
    db = 1 / m * np.sum(A - Y) 
...    
           

邏輯回歸分類算法實作了輸入特征向量X,而輸出Y(範圍0~1)預測X的分類。

第一步,得到關于X線性回歸函數

可以通過線性回歸得到WX + b,其中W是權重,b是偏內插補點。但不能用本式表述預測的值,因為輸出Y的值需要在(0~1)區間;

第二歩,通過激活函數轉換

激活函數的特點是可以将線性函數轉換為非線性函數,并且有輸出值有限,可微分,單調性的特點。本例使用sigmoid,使輸出為預測值Y=sigmoid(WX+b);

第三歩,建構Cost函數

訓練W,b更好的預測真實的類别需要建構Cost代價函數,y^為sigmoid(WX+b)的預測分類值,y為實際分類值(0或者1):

Python資料挖掘——概要

其中L(y^,y)稱為損失函數

Python資料挖掘——概要

訓練的目的就是為了讓L(y,y)足夠小,也就是當y實際分類值為1時,y要盡量偏向1。y實際分類值為0時,y^盡量小接近0。

第四步,梯度下降得到Cost函數的極小值

Python資料挖掘——概要

通過對W,b兩個參數求偏導,不斷疊代往下坡的的位置移動(對w,b值往極小值方向做優化,其中α為學習率控制下降的幅度),全局最優解也就是代價函數(成本函數)J (w,b)這個凸函數的極小值點。

Python資料挖掘——概要

第五步、通過訓練好的W,b預測分類。

Python資料挖掘——概要

4、聚類算法

(1)層次聚類

代碼實作 狗的種類層次聚類

層次聚類将每條資料都當作是一個分類,每次疊代的時候合并距離最近的兩個分類,直到剩下一個分類為止。

(2)K-means++聚類

代碼實作 Kmean++聚類

注:Kmean算法與Kmean++差別在于初始的中心點是直接随機選取k各點。

...
        #kmean初始化随機k個中心點
        #random.seed(1)
        #center = [[self.data[i][r] for i in range(1, len((self.data)))]  
                  #for r in random.sample(range(len(self.data)), k)]
            
        # Kmean ++ 初始化基于距離份量随機選k個中心點
        # 1.随機選擇一個點
        center = []
        center.append(random.choice(range(len(self.data[0]))))
        # 2.根據距離的機率選擇其他中心點
        for i in range(self.k - 1):
            weights = [self.distance_closest(self.data[0][x], center) 
                     for x in range(len(self.data[0])) if x not in center]
            dp = [x for x in range(len(self.data[0])) if x not in center]
            total = sum(weights)
            #基于距離設定權重
            weights = [weight/total for weight in weights]
            num = random.random()
            x = -1
            i = 0
            while i < num :
                x += 1
                i += weights[x]
            center.append(dp[x])
        ... 
           

k-means++算法可概括為:

(1)基于各點到中心點得距離分量,依次随機選取到k個元素作為中心點:

先随機選擇一個點。重複以下步驟,直到選完k個點。

計算每個資料點dp(n)到各個中心點的距離(D),選取最小的值D(dp);

Python資料挖掘——概要

根據D(dp)距離所占的份量來随機選取下一個點作為中心點。

Python資料挖掘——概要

(2)根據各點到中心點的距離分類;

(3)計算各個分類新的中心點。

重複(2、3),直至滿足條件。

原文轉自 https://segmentfault.com/a/1190000017808525