1. 程式人生 > >MADlib——基於SQL的資料探勘解決方案(21)——分類之KNN

MADlib——基於SQL的資料探勘解決方案(21)——分類之KNN

一、分類方法概要

1.  分類的概念

        資料探勘中分類的目的是學會一個分類函式或分類模型,該模型能把資料庫中的資料項對映到給定類別中的某一個。分類可描述如下:輸入資料,或稱訓練集(Training Set),是由一條條資料庫記錄(Record)組成的。每一條記錄包含若干個屬性(Attribute),組成一個特徵向量。訓練集的每條記錄還有一個特定的類標籤(Class Label)與之對應。該類標籤是系統的輸入,通常是以往的一些經驗資料。一個具體樣本的形式可為樣本向量:(v1,v2,...,vn;c),在這裡vi表示欄位值,c表示類別。分類的目的是:分析輸入資料,通過在訓練集中的資料表現出來的特徵,為每一個類找到一種準確的描述或模型。由此生成的類描述用來對未來的測試資料進行分類。儘管這些測試資料的類標籤是未知的,我們仍可以由此預測這些新資料所屬的類。注意是預測,而不是肯定,因為分類的準確率不能達到百分之百。我們也可以由此對資料中的每一個類有更好的理解。也就是說:我們獲得了對這個類的知識。

        所以分類(Classification)也可以定義為:對現有的資料進行學習,得到一個目標函式或規則,把每個屬性集 x 對映到一個預先定義的類標號 y。目標函式或規則也叫分類模型(Classification Model),它有兩個主要作用:一是描述性建模,即作為解釋性工具,用於區分不同類的物件;二是預測性建模,即用於預測未知記錄的類標號。

2.  分類的原理

        分類方法是一種根據輸入資料建立分類模型的系統方法,這些方法都是使用一種學習演算法(Learning Algorithm)確定分類模型,使該模型能夠很好地擬合輸入資料中類標號和屬性集之間的聯絡。學習演算法得到的模型不僅要很好地擬合輸入資料,還要能夠正確地預測未知樣本的類標號。因此,訓練演算法的主要目標就是建立具有很好泛化能力的模型,即建立能夠準確預測未知樣本類標號的模型。圖1展示瞭解決分類問題的一般方法。首先,需要一個訓練集,它由類標號已知的記錄組成。使用訓練集建立分類模型,該模型隨後將運用於檢驗集(Test Set),檢驗集由類標號未知的記錄組成。


圖1 分類原理示意圖

        通常分類學習所獲得的模型可以表示為分類規則形式、決策樹形式或數學公式形式。例如,給定一個顧客信用資訊資料庫,通過學習所獲得的分類規則可用於識別顧客是否具有良好的信用等級或一般的信用等級。分類規則也可用於對今後未知所屬類別的資料進行識別判斷,同時還可以幫助瞭解資料庫中的內容。

        構造模型的過程一般分為訓練和測試兩個階段。在構造模型之前,要求將資料集隨機地分為訓練資料集和測試資料集。在訓練階段,使用訓練資料集,通過分析由屬性描述的資料庫元組來構造模型,假定每個元組屬於一個預定義的類,由一個稱作類標號的屬性來確定。訓練資料集中的單個元組也稱作訓練樣本。由於提供了每個訓練樣本的類標號,該階段也被稱為有指導的學習。在測試階段,使用測試資料集來評估模型的分類準確率,如果認為模型的準確率可以接受,就可以用該模型對其它資料元組進行分類。一般來說,測試階段的代價遠遠低於訓練階段。

        為了提高分類的準確性、有效性和可伸縮性,在進行分類之前,通常要對資料進行預處理,包括:

        1)資料清理。其目的是消除或減少資料噪聲,處理空缺值。

        2)相關性分析。由於資料集中的許多屬性可能與分類任務不相關,若包含這些屬性可能會減慢或誤導學習過程。相關性分析的目的就是刪除這些不相關或冗餘的屬性。

        3)資料變換。資料可以概化到較高層概念。比如,連續值屬性“收入”的數值可以概化為離散值:低、中、高。又比如,標稱值屬性“市”可以概化到高層概念“省”。此外,資料也可以規範化,規範化將給定屬性的值按比例縮放,落入較小的區間,比如[0,1]等。

二、K近鄰簡介

1.  KNN原理

        K近鄰(K-Nearest Neighbor,KNN)演算法是一種基於例項的分類方法,最初由Cover和Hart於1968年提出,是一種非引數的分類技術。非引數方法推遲對訓練資料的建模,只需要假定一個事實,即相似的輸入具有相似的輸出。

        K近鄰分類方法通過計算每個訓練樣例到待分類樣品的距離,取和待分類樣品距離最近的K個訓練樣例,K個樣品中哪個類別的訓練樣例佔多數,則待分類元組就屬於哪個類別。使用最近鄰確定類別的合理性可用下面的諺語來說明:“如果走像鴨子,叫像鴨子,看起來還像鴨子,那麼它很可能就是一隻鴨子”。最近鄰分類器把每個樣例看作d維空間上的一個數據點,其中d是屬性個數。給定一個測試樣例,我們可以計算該測試樣例與訓練集中其它資料點的距離(鄰近度),給定樣例z的K最近鄰是指找出和z距離最近的K個數據點。

        圖2給出了位於圓圈中心的資料點的1-最近鄰、2-最近鄰和3-最近鄰。該資料點根據其近鄰的類標號進行分類。如果資料點的近鄰中含有多個類標號,則將該資料點指派到其最近鄰的多數類。在圖2a中,資料點的1-最近鄰是一個負例,因此該點被指派到負類。如果最近鄰是三個,如圖2c所示,其中包括兩個正例和一個負例,根據多數表決方案,該點被指派到正類。在最近鄰中正例和負例個數相同的情況下(見圖2b),可隨機選擇一個類標號來分類該點。

圖2 一個例項的1-最近鄰、2-最近鄰、3-最近鄰

        前面討論中強調了選擇合適K值的重要性。如果K太小,則最近鄰分類器容易受到由於訓練資料中的噪聲而產生的過分擬合的影響;相反,如果K太大,最近鄰分類器可能會誤分類測試樣例,因為最近鄰列表中可能包含遠離其近鄰的資料點(見圖3)。推定K值的有益途徑是通過有效引數的數目這個概念。有效引數的數目是和K值相關的,大致等於n/K,n是這個訓練集中例項的數目。在實踐中往往通過若干次實驗來確定K值,取分類誤差率最小的K值。

圖3 K較大時的K-最近鄰分類

2.  KNN演算法

        下面是對最近鄰分類方法的一個高層描述。

1:令K是最近鄰數目,D是訓練樣例的集合

2:for 每個測試樣例 do

3:        計算z和每個樣例 之間的距離

4:        選擇離z最近的K個訓練樣例的集合

5:         

6:end for

        對每一個測試樣例  ,演算法計算它和所有訓練樣例  之間的距離(或相似度),以確定其最近鄰列表  。如果訓練樣例的數目很大,那麼這種計算的開銷就會很大。然而,高效的索引技術可以降低為測試樣例找最近鄰時的計算量。

        一旦得到最近鄰列表,測試樣例就會根據最近鄰中的多數類進行分類:

 多數表決:

        其中,  是類標號,  是一個最近鄰的類標號,  是指示函式,如果其引數為真,則返回1,否則返回0。

        在多數表決方法中,每個近鄰對分類的影響都一樣,這使得演算法對K的選擇很敏感,如圖2所示。降低K的影響的一種途徑是根據最近鄰  距離的不同對其作用加權: 。結果使得遠離z的訓練樣例對分類的影響要比那些靠近z的訓練樣例弱一些。使用距離加權表決方案,類標號可以由下面的公式確定:

距離加權表決:

        考慮表1中的一維資料集,根據1-最近鄰、3-最近鄰、5-最近鄰及9-最近鄰,對資料點x=0.5的分類結果分別是+、-、+、-,但如果使用距離加權表決方法,則x=5.0的分類結果分別是+、+、+、+。

x

0.5

3.0

4.5

4.6

4.9

5.2

5.3

5.5

7.0

9.5

y

-

-

+

+

+

-

-

+

-

-

d

4.5

2.0

0.5

0.4

0.1

0.2

0.3

0.5

2.0

4.5

w

0.05

0.25

4

6.25

100

24.5

11.11

4

0.25

0.05

表1 一維資料集的距離加權

3.  KNN特徵

        最近鄰分類器的特點總結如下:

  • 最近鄰分類屬於一類廣泛的技術,這種技術稱為基於例項的學習,它使用具體的訓練例項進行預測,而不必維護源自資料的抽象(或模型)。基於例項的學習演算法需要鄰近性度量來確定例項間的相似性或距離,還需要分類函式根據測試例項與其它例項的鄰近性返回測試的預測類標號。
  • 像最近鄰分類器這樣的學習方法不需要建立模型,然而,分類測試樣例的開銷很大,因為需要逐個計算測試樣例和訓練樣例之間的相似度。相反,引數化的學習方法通常花費大量計算資源建立模型,模型一旦建立,分類測試樣例就會很快。
  • 最近鄰分類器基於區域性資訊進行預測,因此當K很小時對噪聲非常敏感。
  • 最近鄰分類器可以生成任意形狀邊界的決策邊緣,能提供更加靈活的模型表示。最近鄰分類器的局側邊緣還有很高的可變性,因為它們依賴於訓練樣例的組合。增加最近鄰數目可以降低這種可變性。
  • 除非採用適當的鄰近性度量和資料預處理,否則最近鄰分類器可能做出錯誤的預測。例如,我們想根據身高(以米為單位)和體重(以斤為單位)等屬性對一群人分類。高度的可變性很小,從1.5米到1.85米,而體重範圍則可能從90斤到200斤。如果不考慮屬性值的單位,那麼鄰近性度量可能就會被人的體重差異所左右。

二、MADlib中KNN函式

        MADlib提供的KNN函式仍然處於早期開發階段。將來的版本會解決一些問題,並且介面和實現可能會發生變化。正如前面所討論的,MADlib的KNN函式以訓練資料集作為輸入資料點,訓練資料集中包含測試樣例中的特徵,函式在訓練集中為測試集中的每個資料點查詢K個最近點。KNN函式的輸出取決於任務型別。對於分類,輸出是K個最近資料點類別的多數票對應的類別。也就是說,測試樣例被分配給了最近鄰中最可能的類。而對於迴歸,輸出是給定測試點K個最近鄰的平均值。

1. 語法

knn( point_source,
     point_column_name,
     label_column_name,
     test_source,
     test_column_name,
     id_column_name,
     output_table,
     operation,
     k
   )

2. 引數

引數名稱

資料型別

描述

point_source

TEXT

包含訓練資料點的表的名稱。訓練資料點應該按行儲存在型別為DOUBLE PRECISION[]的列中。

point_column_name

TEXT

包含訓練資料點的列名。

label_column_name

TEXT

具有訓練資料點類標籤的列名。

test_source

TEXT

包含測試資料點的表的名稱。測試資料點應該按行儲存在型別為DOUBLE PRECISION[]的列中。

test_column_name

TEXT

包含訓練資料點的列名。

id_column_name

TEXT

測試資料表中具有資料點ID的列的名稱。

output_table

TEXT

儲存輸出結果的表名。

operation

TEXT

任務型別:‘r’表示迴歸,‘c’表示分類。

K(可選)

INTEGER

預設值為1,最近鄰數量。對於分類,應該是一個奇數。

表2 knn函式引數說明

3. 輸出

        KNN函式的輸出是一個包含以下列的表:

        id:INTEGER型別,測試資料點的ID。

        test_column_name:DOUBLE PRECISION[]型別,測試資料點。

        prediction:INTEGER型別,類別標籤或迴歸的均值。

三、示例

        本示例取自維基百科中的“決策樹”條目,問題描述如下:

        小王是一家著名高爾夫俱樂部的經理。但是他被僱員數量問題搞得心情十分不好。某些天好像所有人都來玩高爾夫,以至於所有員工都忙的團團轉還是應付不過來,而有些天不知道什麼原因卻一個人也不來,俱樂部為僱員數量浪費了不少資金。小王的目的是通過下週天氣預報尋找什麼時候人們會打高爾夫,以適時調整僱員數量。因此首先他必須瞭解人們決定是否打球的原因。在兩週時間內可以得到以下記錄:天氣狀況有晴、雲和雨;華氏溫度表示的氣溫;相對溼度百分比;是否有風。當然還有顧客是不是在這些日子光顧俱樂部。最終他得到了表3所示的14行5列的資料。

自變數

因變數

天氣情況

華氏溫度

相對溼度

是否有風

是否打球

sunny

85

85

FALSE

Don’t Play

sunny

80

90

TRUE

Don’t Play

overcast

83

78

FALSE

Play

rain

70

96

FALSE

Play

rain

68

80

FALSE

Play

rain

65

70

TRUE

Don’t Play

overcast

64

65

TRUE

Play

sunny

72

95

FALSE

Don’t Play

sunny

69

70

FALSE

Play

rain

75

80

FALSE

Play

sunny

75

70

TRUE

Play

overcast

72

90

TRUE

Play

overcast

81

75

FALSE

Play

rain

71

80

TRUE

Don’t Play

表3 兩週天氣與是否打高爾夫球資料

        我們將利用MADlib的KNN函式來解決此問題。

 1.  準備訓練資料

        將天氣、溫度、溼度資料進行0-1標準化,去除資料的單位限制,將其轉化為無量綱的純數值,便於不同單位或量級的指標能夠進行比較和加權。

drop table if exists source_data;
create table source_data (c1 int, c2 int, c3 int, c4 int, c5 int, c6 int);
insert into source_data values 
(1, 1,85,85,0, 0),
(2, 1,80,90,1, 0),
(3, 2,83,78,0, 1),
(4, 3,70,96,0, 1),
(5, 3,68,80,0, 1),
(6, 3,65,70,1, 0),
(7, 2,64,65,1, 1),
(8, 1,72,95,0, 0),
(9, 1,69,70,0, 1),
(10,3,75,80,0, 1),
(11,1,75,70,1, 1),
(12,2,72,90,1, 1),
(13,2,81,75,0, 1),
(14,3,71,80,1, 0);

drop table if exists knn_train_data;
create table knn_train_data (
                    id integer, 
                    data float8[], 
                    label integer
                    );

insert into knn_train_data 
select c1, 
       array[round((c2 - min_c2)/cast((max_c2 - min_c2) as numeric),4)::float8,
             round((c3 - min_c3)/cast((max_c3 - min_c3) as numeric),4)::float8,
             round((c4 - min_c4)/cast((max_c4 - min_c4) as numeric),4)::float8,
             c5],
       c6
  from source_data,
       (select min(c2) min_c2,max(c2) max_c2,
               min(c3) min_c3,max(c3) max_c3,
   min(c4) min_c4,max(c4) max_c4 
      from source_data) t;

2.  準備測試資料

        用平均溫度和溼度測試。   

select round((avg(c3)-min(c3))/(max(c3)-min(c3)),4),
       round((avg(c4)-min(c4))/(max(c4)-min(c4)),4)
  from source_data;

        結果:

 round  | round  
--------+--------
 0.4558 | 0.4931
(1 row)
        生成測試資料。
drop table if exists knn_test_data;
create table knn_test_data 
( id integer, 
  data float8[]
);

insert into knn_test_data values
(1, '{0,0.4558,0.4931,0}'),
(2, '{0.5,0.4558,0.4931,0}'),
(3, '{1,0.4558,0.4931,0}'),
(4, '{0,0.4558,0.4931,1}'),
(5, '{0.5,0.4558,0.4931,1}'),
(6, '{1,0.4558,0.4931,1}');

3.  執行KNN分類

drop table if exists madlib_knn_result_classification;
select * from madlib.knn( 
                'knn_train_data',      -- 訓練資料表
                'data',                -- 訓練資料列
                'label',               -- 類別標籤列
                'knn_test_data',       -- 測試資料表
                'data',                -- 測試資料列
                'id',                  -- 測試資料ID列 
                'madlib_knn_result_classification',  -- 輸出表
                'c',                   -- 分類
                 1                     -- 最近鄰數
                );

4.  檢視輸出結果

select * from madlib_knn_result_classification order by id;

        結果:

 id |         data          | prediction 
----+-----------------------+------------
  1 | {0,0.4558,0.4931,0}   |          1
  2 | {0.5,0.4558,0.4931,0} |          1
  3 | {1,0.4558,0.4931,0}   |          1
  4 | {0,0.4558,0.4931,1}   |          1
  5 | {0.5,0.4558,0.4931,1} |          1
  6 | {1,0.4558,0.4931,1}   |          0
(6 rows)


相關推薦

MADlib——基於SQL資料解決方案21——分類KNN

一、分類方法概要1.  分類的概念        資料探勘中分類的目的是學會一個分類函式或分類模型,該模型能把資料庫中的資料項對映到給定類別中的某一個。分類可描述如下:輸入資料,或稱訓練集(Training Set),是由一條條資料庫記錄(Record)組成的。每一條記錄包含

MADlib——基於SQL資料解決方案17——迴歸Cox比例風險迴歸

一、Cox比例風險迴歸簡介        Cox比例風險迴歸模型(Cox’s proportional hazards regression model),簡稱Cox迴歸模型,由英國統計學家D.R.Cox於1972年提出,主要用於腫瘤和其它慢性病的預後分析,也可用於佇列研究的

MADlib——基於SQL資料解決方案8——資料探索描述性統計

        對資料進行統計是從定量的角度去探索資料,是最基本的資料探索方式,其主要目的是瞭解資料從統計學上反映的量的特徵,以便我們更好地認識這些將要被挖掘的資料。        我們先要清楚兩個關於統計學的基本概念:總體和樣本。統計的總體是人們研究物件的全體,又稱母體,如

MADlib——基於SQL資料解決方案26——聚類k-means方法

        “物以類聚,人以群分”,其核心思想就是聚類。所謂聚類,就是將相似的事物聚集在一起,而將不相似的事物劃分到不同的類別的過程,是資料分析中十分重要的一種手段。比如古典生物學中,人們通過物種的形貌特徵將其分門別類,可以說就是一種樸素的人工聚類。如此,我們就可以將世界

Python資料學習筆記12淘寶圖片爬蟲實戰

       所謂圖片爬蟲,即是從網際網路中自動把對方伺服器上的圖片爬下來的爬蟲程式。 一、圖片爬蟲前的網頁連結分析 1.首先開啟淘寶首頁,在搜尋框中輸入關鍵詞,如“神舟”,在搜尋結果介面中點選下一頁,分別開啟第一頁,第二頁,第三頁的搜尋結果,並記下每一頁結果的URL至記

Python資料學習筆記1文字挖掘入門

一、準備階段: (1)開啟cmd,pip安裝jieba(pip install jieba) (2)開啟python安裝目錄的Lib->site-packages->jieba,開啟dict.txt,可以看到這是jieba模組的詞典:          每

java.lang.IllegalArgumentException java.sql.Date.getHours的解決方案SSH

問題描述: Caused by: java.lang.IllegalArgumentException at java.sql.Date.getHours(Date.java:143) 這是由於於java.util.Date 和 java.sql.Date的轉換問題造

資料常見錯誤解決方案轉載

1、用./bin/spark-shell啟動spark時遇到異常:java.net.BindException: Can't assign requested address: Service 'sparkDriver' failed after 16 retries! 解

資料乾貨總結--推薦演算法CF

本文共計1245字,預計閱讀時長八分鐘推薦演算法(二)--CF演算法一、推薦的本質推薦分為非個性化和個性化,非個性化推薦比如各類榜單,而本系列主要介紹個性化推薦,即:在合適的場景,合適的時機,通過合適的渠道,把合適的內容,推薦給合適的使用者二、推薦演算法的種類1. 基於內容C

資料乾貨總結--NLP基礎

本文共計1463字,預計閱讀時長八分鐘 NLP-基礎和中文分詞 一、本質 NLP (Natural Language Processing)自然語言處理是一門研究計算機處理人類語言的技術 二、NLP用來解決什麼問題 語音合成(Speech synth

資料乾貨總結--推薦演算法CB

本文共計927字,預計閱讀時長六分鐘推薦演算法(一)--CB演算法一、推薦的本質推薦分為非個性化和個性化,非個性化推薦比如各類榜單,而本系列主要介紹個性化推薦,即:在合適的場景,合適的時機,通過合適的渠道,把合適的內容,推薦給合適的使用者二、推薦演算法的種類1. 基於內容Co

資料乾貨總結--NLP進階-詳解Jieba分詞工具

NLP進階-詳解Jieba分詞工具 一、Jieba分詞工具 1. 三種模式 • 精確模式:將句子最精確的分開,適合文字分析 • 全模式:句子中所有可以成詞的詞語都掃描出來,速度快,不能解決歧義 • 搜尋引擎模式:在精確模式基礎上,對長詞再次切分,提高召回 2.實現的演算法 • 基於Tri

HAWQ + MADlib 玩轉資料——關聯規則方法Apriori演算法

一、關聯規則簡介        關聯規則挖掘的目標是發現數據項集之間的關聯關係,是資料挖據中一個重要的課題。關聯規則最初是針對購物籃分析(Market Basket Analysis)問題提出的。假設超市經理想更多地瞭解顧客的購物習慣,特別是想知道,哪些商品顧客可能會在一次購

HAWQ + MADlib 玩轉資料——主成分分析與主成分投影

一、主成分分析(Principal Component Analysis,PCA)簡介        在資料探勘中經常會遇到多個變數的問題,而且在多數情況下,多個變數之間常常存在一定的相關性。例如,網站的“瀏覽量”和“訪客數”往往具有較強的相關關係,而電商應用中的“下單數”和“成交數”也具有較強的相關關係。

收藏 | 大資料應用及其解決方案完整版

目錄 1. 大資料概述 1.1. 概述 1.2. 大資料定義 1.3. 大資料技術發展 2. 大資料應用 2.1. 大資料應用闡述 2.2. 大資料應用架構 2.3. 大資料行業應用 3. 大資料解決方案  3.1. 大資料技術組成 

社交網站的資料與分析高清版PDF

社交網站的資料探勘與分析(高清版)PDF百度網盤連結:https://pan.baidu.com/s/1ia57ZMxvdTtq7eragsITzg 提取碼:5hth 複製這段內容後開啟百度網盤手機App,操作更方便哦內容簡介 · · · · · · Facebook、Twitter和LinkedIn產生了大

機器學習&資料筆記_16常見面試機器學習演算法思想簡單梳理

  前言:   找工作時(IT行業),除了常見的軟體開發以外,機器學習崗位也可以當作是一個選擇,不少計算機方向的研究生都會接觸這個,如果你的研究方向是機器學習/資料探勘之類,且又對其非常感興趣的話,可以考慮考慮該崗位,畢竟在機器智慧沒達到人類水平之前,機器學習可以作為一種重要手段,而隨著科技的不斷髮展,

資料十大經典演算法--CART: 分類與迴歸樹

一、決策樹的型別  在資料探勘中,決策樹主要有兩種型別: 分類樹 的輸出是樣本的類標。 迴歸樹 的輸出是一個實數 (例如房子的價格,病人呆在醫院的時間等)。 術語分類和迴歸樹 (CART) 包含了上述兩種決策樹, 最先由Breiman 等提出.分類樹和迴歸樹有些共同點和不同

機器學習資料十個重要演算法

資料探勘中常用的十個重要演算法  一、 C4.5 C4.5演算法是機器學習演算法中的一種分類決策樹演算法,其核心演算法是ID3 演算法.   C4.5演算法繼承了ID3演算法的長處。並在下面幾方面對ID3演算法進行了改進: 1) 用資訊增益率來選擇屬性,克服了用資訊增

資料一般流程資料清洗,特徵提取,建模,調參

最近一直在實習,好長時間沒更新部落格了。哎,懶惰之心不可有啊!! 實習的崗位是資料探勘相關的,所以正好把到目前為止實習期間遇到的一些問題、學到的一些東西總結一下,並參考了一些部落格,自我提升。嘿嘿嘿~