1.理解Kmeans聚類(lèi)
1)基本概念
- 聚類(lèi):無(wú)監(jiān)督分類(lèi)吱抚,對(duì)無(wú)標(biāo)簽案例進(jìn)行分類(lèi)。
- 半監(jiān)督學(xué)習(xí):從無(wú)標(biāo)簽的數(shù)據(jù)入手骄噪,是哦那個(gè)聚類(lèi)來(lái)創(chuàng)建分類(lèi)標(biāo)簽诸尽,然后用一個(gè)有監(jiān)督的學(xué)習(xí)算法(如決策樹(shù))來(lái)尋找這些類(lèi)中最重要的預(yù)測(cè)指標(biāo)。
- kmeans聚類(lèi)算法特點(diǎn):
- kmeans算法涉及將n個(gè)案例中的每一個(gè)案例分配到指定k個(gè)類(lèi)中的一個(gè)(指定k是為了最小化每個(gè)類(lèi)內(nèi)部差異挨决,最大化類(lèi)之間的差異)请祖。
- 為避免遍歷案例所有可能的組合來(lái)計(jì)算最優(yōu)聚類(lèi),kemans使用了局部最優(yōu)解的啟發(fā)式過(guò)程脖祈,即對(duì)初始的類(lèi)分配進(jìn)行修正來(lái)判斷是否提升了類(lèi)內(nèi)部的同質(zhì)性肆捕。
- kmeans聚類(lèi)的兩個(gè)階段:一是將案例分配到初始的k個(gè)類(lèi)中;二是根據(jù)落入當(dāng)前類(lèi)的案例調(diào)整類(lèi)的邊界來(lái)更新分配盖高。重復(fù)更新和分配多次慎陵,直到改變不會(huì)提升類(lèi)的優(yōu)度為止。
- 可通過(guò)嘗試多次不同k的聚類(lèi)分析來(lái)測(cè)試研究結(jié)果的穩(wěn)健性喻奥。
2)kmeans運(yùn)作的基本原理
①使用距離來(lái)分配和更新類(lèi)
- 初始類(lèi)中心的選擇:從訓(xùn)練集中選擇的k個(gè)隨機(jī)案例來(lái)確定席纽;或者選擇發(fā)生再特征空間任意地方的隨機(jī)值(而不是只在數(shù)據(jù)的觀測(cè)值之間進(jìn)行選擇);或者完全跳過(guò)這一步撞蚕,通過(guò)將每個(gè)案例隨機(jī)分配到一個(gè)類(lèi)中润梯,直接進(jìn)入更新階段。
- 選擇初始類(lèi)中心之后诈豌,其他的案例將分配到與其最相似仆救,或者根據(jù)距離函數(shù)最相近的類(lèi)中心抒和。距離函數(shù)如歐氏距離矫渔、曼哈頓距離、閔可夫斯基距離等庙洼。
- 距離計(jì)算的數(shù)據(jù)必須是數(shù)值型,且需要標(biāo)準(zhǔn)化,計(jì)算的是每一個(gè)案例與每一個(gè)類(lèi)中心之間的距離油够。
- 更新類(lèi):將初始的類(lèi)中心轉(zhuǎn)移到一個(gè)新的位置(“質(zhì)心”蚁袭,通過(guò)計(jì)算分配到當(dāng)前類(lèi)的各點(diǎn)的均值來(lái)獲得)。類(lèi)中心改變之后石咬,類(lèi)的邊界發(fā)生變化揩悄,案例重新分配,如此反復(fù)更新鬼悠,直到?jīng)]有額外的案例被重新分配為止删性,聚類(lèi)最終完成。
- 聚類(lèi)結(jié)果的表達(dá):一是可以報(bào)告每個(gè)案例的分配情況焕窝;二是可以報(bào)告最后一次更新之后的質(zhì)心的坐標(biāo)蹬挺。
運(yùn)算過(guò)程如下:
②選擇適當(dāng)?shù)木垲?lèi)數(shù)
- kmeans算法對(duì)于隨機(jī)選擇的聚類(lèi)中心很敏感榕茧。選擇類(lèi)的數(shù)目需要一種微妙的平衡:大k會(huì)提升類(lèi)的同質(zhì)性,但有過(guò)擬合的風(fēng)險(xiǎn)客给。
- 理想情況下雪猪,最好有一些關(guān)于真實(shí)分組的先驗(yàn)知識(shí)。有時(shí)k也由業(yè)務(wù)需求或分析動(dòng)機(jī)所決定起愈。
- 若沒(méi)有任何先驗(yàn)知識(shí)只恨,經(jīng)驗(yàn)規(guī)則就是k設(shè)為n/2的平方根(n是全部案例總數(shù)),對(duì)于大的數(shù)據(jù)集一般偏大抬虽。
- “肘部法”度量不同k值:找到一個(gè)k(肘部點(diǎn))官觅,使得高于該值之后的收益會(huì)發(fā)生遞減。
- 但在實(shí)際中阐污,反復(fù)測(cè)試大量的k值是不可行的休涤。不要要求最嚴(yán)格的性能,獲得類(lèi)最優(yōu)解集笛辟。大部分應(yīng)用中功氨,選擇一個(gè)k就夠了。
2.Kmeans聚類(lèi)應(yīng)用示例
探尋青少年市場(chǎng)細(xì)分
1)收集數(shù)據(jù)
30000名美國(guó)高中生的隨機(jī)案例數(shù)據(jù)集手幢,在知名社交網(wǎng)絡(luò)服務(wù)中保存了他們的個(gè)人資料捷凄。將網(wǎng)站頁(yè)面內(nèi)容劃分單詞,36個(gè)單詞被選來(lái)代表5大興趣類(lèi)围来。每個(gè)案例包括4個(gè)個(gè)人特征(畢業(yè)年份跺涤,性別匈睁,年齡,交友數(shù))和36種興趣桶错。
數(shù)據(jù)下載:
鏈接: https://pan.baidu.com/s/1CGkaRPc3glCjI-hWWg1Kug 提取碼: 74bm
2)探索和準(zhǔn)備數(shù)據(jù)
包括缺失值的查看航唆,缺失值的虛擬編碼和缺失值插補(bǔ)等。
## Step 2: Exploring and preparing the data ----
teens <- read.csv("snsdata.csv")
str(teens)
# look at missing data for female variable
table(teens$gender)
table(teens$gender, useNA = "ifany") #計(jì)數(shù)缺失值
# look at missing data for age variable
summary(teens$age) #包含缺失值統(tǒng)計(jì)
# eliminate age outliers
teens$age <- ifelse(teens$age >= 13 & teens$age < 20,
teens$age, NA)
summary(teens$age)
# reassign missing gender values to "unknown"
teens$female <- ifelse(teens$gender == "F" &
!is.na(teens$gender), 1, 0)
teens$no_gender <- ifelse(is.na(teens$gender), 1, 0)
# check our recoding work
table(teens$gender, useNA = "ifany")
table(teens$female, useNA = "ifany")
table(teens$no_gender, useNA = "ifany")
# finding the mean age by cohort
mean(teens$age) # doesn't work
mean(teens$age, na.rm = TRUE) # works
# age by cohort
aggregate(data = teens, age ~ gradyear, mean, na.rm = TRUE)
# create a vector with the average age for each gradyear, repeated by person
# ave函數(shù)返回一個(gè)具有重復(fù)的組均值的向量院刁,使得結(jié)果在長(zhǎng)度上等于原始向量的長(zhǎng)度
ave_age <- ave(teens$age, teens$gradyear,
FUN = function(x) mean(x, na.rm = TRUE))
teens$age <- ifelse(is.na(teens$age), ave_age, teens$age)
# check the summary results to ensure missing values are eliminated
summary(teens$age)
3)訓(xùn)練模型
使用基礎(chǔ)包的kmeans函數(shù)糯钙。注意將特征標(biāo)準(zhǔn)化,這里用z-score標(biāo)準(zhǔn)化退腥。
另一個(gè)就是k值的指定超营,比如對(duì)人口分析很熟悉,或者對(duì)關(guān)于自然分組的真是數(shù)量有一些預(yù)感阅虫,也可參考一些資料等演闭,我們將符合年齡的高中生特征確定為5個(gè)典型類(lèi)型(聰明人,運(yùn)動(dòng)員颓帝,公主米碰,罪犯,無(wú)特征)购城。
## Step 3: Training a model on the data ----
interests <- teens[5:40]
interests_z <- as.data.frame(lapply(interests, scale))
set.seed(2345)
teen_clusters <- kmeans(interests_z, 5)
4)評(píng)估性能
模型的成功與否在于類(lèi)對(duì)于預(yù)期目的是否有用吕座。評(píng)估一個(gè)類(lèi)是否有用的最基本方法之一就是檢查落在每一組中的案例數(shù),數(shù)目過(guò)多或過(guò)少(如1個(gè)或幾個(gè))瘪板,則這些類(lèi)不太有用吴趴。
為深入了解類(lèi),可查看聚類(lèi)質(zhì)心的坐標(biāo)侮攀。因?yàn)橐呀?jīng)做了z-score標(biāo)準(zhǔn)化锣枝,所以負(fù)值表示低于總體均值,正值表示高于總體均值兰英。
## Step 4: Evaluating model performance ----
# look at the size of the clusters
teen_clusters$size
# look at the cluster centers
teen_clusters$centers
通過(guò)研究類(lèi)在特征(興趣)中的表現(xiàn)撇叁,可以構(gòu)建有一個(gè)表來(lái)列出每組中的主要興趣項(xiàng):
5)提高模型性能
根據(jù)聚類(lèi)結(jié)果,可以確定每個(gè)案例被分配到了哪一類(lèi)中畦贸,再探究不同的類(lèi)在原始數(shù)據(jù)中各特征的差異陨闹。
## Step 5: Improving model performance ----
# apply the cluster IDs to the original data frame
teens$cluster <- teen_clusters$cluster
# look at the first five records
teens[1:5, c("cluster", "gender", "age", "friends")]
# mean age by cluster
aggregate(data = teens, age ~ cluster, mean)
# proportion of females by cluster
aggregate(data = teens, female ~ cluster, mean)
# mean number of friends by cluster
aggregate(data = teens, friends ~ cluster, mean)
年齡、性別薄坏、朋友數(shù)量之間的關(guān)系表明趋厉,這些類(lèi)是有用的預(yù)測(cè)因子,以這種方式來(lái)驗(yàn)證這些類(lèi)的預(yù)測(cè)能力胶坠。