機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

AIBigbull2050發表於2019-08-25

專欄推薦

正文

現在有一個資料集是美國國會投票的資料,資料集如圖所示:

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

資料集第一列為name,表示國會議員的名字,第二列為議員政黨R是共和黨,D是民主黨,I是無黨派人士

後面的00001,00004表示的是法案的標號,0表示不支援,1表示支援

我們現在並不知道這個資料集的一些情況,但是我們可以透過聚類演算法來看一下這個資料集有哪些特點

我們先來讀取這個資料,然後看以下這些資料的均值,和各黨派的人數

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

輸出的結果為:

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

value_counts()表示每個類別中的人數,透過輸出的這個結果,可以看出R共和黨為54人,D民主黨為44ren,I無黨派人士為2個人,這就是所有的議會中人員的組成。後面的是輸出的均值,也就是每個議案的均值得多少分,0是0分,1是1分,得分高表示支援率大。


每個議員都會對每個法案投票,0是反對,1是支援,我們如何才能判斷出兩個議員之間的都投法案的相似度呢?我們可以使用歐式距離來表示兩個樣本之間的相似程度。

它的公式為:

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

假如以下面的兩個議員資料來分析兩個一下這兩個議員的相似度,來看一下兩個議員之間投票的相似度。

Cardin,D,MD,1,0,0,1,0,1,0,1,0,0,1,1,0,1,1Carper,D,DE,0,0,0,1,0,1,0,1,0,0,0,1,0,1,1

那麼此時x1=1,y1=0

x2=0,y1=0

以此類推,透過這個公式算出來的就是歐式距離,歐式距離越小就表示樣本之間的差距越小,越相似。在python中已經封裝好了這個方法,我們可以透過呼叫這個方法來完成計算歐式距離的操作

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

這個euclidean_distances為歐式距離,可以透過這個方法來計算歐式距離

votes.iloc[0,3:]獲取第一行的第三列開始的所有資料

votes.iloc[1,3:]獲取第二行的第三列開始的所有資料

預設是資料是列的形式,然後改變其形狀改成(1,-1),也就是行的形式

輸出的結果就是兩個樣本之間的距離。距離值為:[[1.73205081]]


下面透過python的庫來直接使用kmeans來聚合這些資料

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

這個表示聚合成兩個簇,random_state表示兩個中心點不是隨機的,而是在random_state=1的那個固定的位置

kmeans_model.fit_transform表示擬合資料,它會將傳入的資料聚類,聚成兩類,擬合資料的返回值為樣本距離聚簇中心點的距離

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

這個就是 senator_distances的值,是有多少個樣本就有多少行,聚成多少個簇就有多少列,比如第一個【3.12141628 1.3134775】就表示該樣本與聚簇中心1的距離是3.12141628,與聚簇中心2的距離是1.3134775,第二行就表示第二個樣本分別與聚簇中心的距離。

labels為聚類之後的類別,我們輸出labels的結果為:

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

可以看出有些樣本被分到了1,有些樣本被分到了0,那麼這就表示分類成功了,為了更加清晰的可以看出聚類的情況,我們可以以影像的形式進行顯示:

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

透過圖,我們可以看出這些樣本點的聚類情況,我們還可以使用另外一種方式

print(pd.crosstab(labels, votes["party"]))

交叉表crosstab,可以按照指定的行和列統計分組頻數,用起來非常方便,行就是labels,列就是votes["party"],我們輸出它的效果為:

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

這個看著很清晰,可以看出D黨派的聚類中有41個人聚到了0,還有3個人聚到了1

而R黨派中全部的54個人都聚到了類別1中,這就是非常直觀的情況

我們可以透過這個還可以發現,D黨派中有3個人是偏向R黨派的,所以我們下面的任務是把這些人給找出來,來看這三個人究竟是誰?

democratic_outliers = votes[(labels == 1) & (votes["party"] == "D")]

print(democratic_outliers)

這個程式碼就是選出聚類類別是1的,並且黨派還是D的,我們輸出這個,就可以看到這三個人究竟是誰?

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

我們已經將資料聚成了兩個類,但是有一種點叫做離群點,就是說這個樣本點無論它屬於哪個簇,它距離所有簇的中心點都是很遠的額,這就是離群點。我們透過什麼樣的方式才能找到這樣的離群點呢?

我們在上面已經獲取了樣本與聚簇中心點之間的距離 senator_distances,所以只要距離和最大的就是離群點了,但是有一種情況是他恰好在兩者的中間的位置,那麼它不是離群點,但是它距離聚簇中心點的距離和加起來也不小,為了防止出現這種問題,我們不能簡單的相加,而是將其來個立方,這樣的話,剛才的情況的值會很小。

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

這個就是將樣本與聚簇中心點的距離算一個立方,然後加起來,然後創造一個新的列extremism,然後對votes根據extremism進行排序,輸出結果為:

機器學習演算法實戰:使用聚類演算法統計美國國會不同議員的投票主張

可以每個樣本與聚簇中心的距離,越大就表示越遠,可以定義為離群點。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2654847/,如需轉載,請註明出處,否則將追究法律責任。

相關文章