python 機(jī)器學(xué)習(xí)(二)分類算法-k近鄰算法

分類算法-K近鄰算法

同步更新在個(gè)人網(wǎng)站:http://www.wangpengcufe.com/machinelearning/pythonml-pythonml2/

一、什么是K近鄰算法训裆?

定義:

如果一個(gè)樣本在特征空間中的k個(gè)最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別。

來源:

KNN算法最早是由Cover和Hart提出的一種分類算法.

計(jì)算距離公式:

兩個(gè)樣本的距離可以通過如下公式計(jì)算酪刀,又叫歐式距離。
比如說钮孵,a(a1,a2,a3),b(b1,b2,b3)


歐式距離

二骂倘、K近鄰算法的實(shí)現(xiàn)

sk-learn近鄰算法API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors:int,可選(默認(rèn)= 5),k_neighbors查詢默認(rèn)使用的鄰居數(shù) 
algorithm:{‘a(chǎn)uto’巴席,‘ball_tree’历涝,‘kd_tree’,‘brute’}漾唉,可選用于計(jì)算最近鄰居的算法:‘ball_tree’將會使用 BallTree荧库,‘kd_tree’將使用 KDTree≌孕蹋‘a(chǎn)uto’將嘗試根據(jù)傳遞給fit方法的值來決定最合適的算法分衫。 (不同實(shí)現(xiàn)方式影響效率)

近鄰算法實(shí)例

案例背景:(kaggle地址:https://www.kaggle.com/c/facebook-v-predicting-check-ins/overview

預(yù)測入住

數(shù)據(jù)下載地址:train.csv

數(shù)據(jù)格式:

            row_id       x       y  accuracy    time    place_id
0                0  0.7941  9.0809        54  470702  8523065625
1                1  5.9567  4.7968        13  186555  1757726713
2                2  8.3078  7.0407        74  322648  1137537235
3                3  7.3665  2.5165        65  704587  6567393236
4                4  4.0961  1.1307        31  472130  7440663949
...            ...     ...     ...       ...     ...         ...
29118016  29118016  6.5133  1.1435        67  399740  8671361106
29118017  29118017  5.9186  4.4134        67  125480  9077887898
29118018  29118018  2.9993  6.3680        67  737758  2838334300
29118019  29118019  4.0637  8.0061        70  764975  1007355847
29118020  29118020  7.4523  2.0871        17  102842  7028698129

[29118021 rows x 6 columns]

實(shí)現(xiàn)思路:
1、數(shù)據(jù)集的處理(縮小數(shù)據(jù)集范圍般此,處理日期數(shù)據(jù)蚪战,增加分割的日期數(shù)據(jù)牵现,刪除沒用的日期數(shù)據(jù),將簽到位置少于n個(gè)用戶的刪除)
2邀桑、分割數(shù)據(jù)集
3施籍、對數(shù)據(jù)集進(jìn)行標(biāo)準(zhǔn)化
4、estimator流程進(jìn)行分類預(yù)測

具體代碼如下:

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# 讀取數(shù)據(jù)
data = pd.read_csv("./data/FBlocation/train.csv")
# 處理數(shù)據(jù)
# 1概漱、縮小數(shù)據(jù),查詢數(shù)據(jù)集范圍
data = data.query("x > 1.0 &  x < 1.25 & y > 2.5 & y < 2.75")
# 處理時(shí)間的數(shù)據(jù)
time_value = pd.to_datetime(data['time'], unit='s')
 # 把日期格式轉(zhuǎn)換成 字典格式
time_value = pd.DatetimeIndex(time_value)
# 構(gòu)造一些特征
data['day'] = time_value.day
data['hour'] = time_value.hour
data['weekday'] = time_value.weekday
# 把時(shí)間戳特征刪除
data = data.drop(['time'], axis=1)
# 把簽到數(shù)量少于n個(gè)目標(biāo)位置刪除
place_count = data.groupby('place_id').count()
tf = place_count[place_count.row_id > 3].reset_index()
data = data[data['place_id'].isin(tf.place_id)]

# 取出數(shù)據(jù)當(dāng)中的特征值和目標(biāo)值
y = data['place_id']
x = data.drop(['place_id'], axis=1)
# 進(jìn)行數(shù)據(jù)的分割訓(xùn)練集合測試集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 特征工程(標(biāo)準(zhǔn)化)
std = StandardScaler()
# 對測試集和訓(xùn)練集的特征值進(jìn)行標(biāo)準(zhǔn)化
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 進(jìn)行算法流程 # 超參數(shù)
knn = KNeighborsClassifier()
knn.fit(x_train, y_train)
y_predict = knn.predict(x_test)
print("預(yù)測的目標(biāo)簽到位置為:", y_predict)
print("預(yù)測的準(zhǔn)確率:", knn.score(x_test, y_test))

運(yùn)行結(jié)果:

預(yù)測的目標(biāo)簽到位置為: [8258328058 2355236719 6683426742 ... 5606572086 4932578245 9237487147]
預(yù)測的準(zhǔn)確率: 0.3959810874704492

思考問題

1丑慎、k值取多大?有什么影響瓤摧?
2竿裂、性能問題?

三照弥、K近鄰算法總結(jié)

K近鄰算法優(yōu)缺點(diǎn)

優(yōu)點(diǎn)
簡單腻异,易于理解,易于實(shí)現(xiàn)这揣,無需估計(jì)參數(shù)悔常,無需訓(xùn)練

缺點(diǎn)

  • 懶惰算法,對測試樣本分類時(shí)的計(jì)算量大给赞,內(nèi)存開銷大
  • 必須指定K值机打,K值選擇不當(dāng)則分類精度不能保證

使用場景

小數(shù)據(jù)場景,幾千~幾萬樣本片迅,具體場景具體業(yè)務(wù)去測試

四残邀、分類模型的評估

評估方法

estimator.score()
一般最常見使用的是準(zhǔn)確率,即預(yù)測結(jié)果正確的百分比

混淆矩陣
在分類任務(wù)下柑蛇,預(yù)測結(jié)果(Predicted Condition)與正確標(biāo)記(True Condition)之間存在四種不同的組合芥挣,構(gòu)成混淆矩陣(適用于多分類)

混淆矩陣

精確率(Precision):預(yù)測結(jié)果為正例樣本中真實(shí)為正例的比例(查得準(zhǔn))
精確率(Precision)

召回率(Recall):真實(shí)為正例的樣本中預(yù)測結(jié)果為正例的比例(查的全,對正樣本的區(qū)分能力)
召回率(Recall)

其他分類標(biāo)準(zhǔn)耻台,F1-score空免,反映了模型的穩(wěn)健型
F1-score

分類模型評估API

評估API :

sklearn.metrics.classification_report

用法:

sklearn.metrics.classification_report(y_true, y_pred, target_names=None)

y_true:真實(shí)目標(biāo)值

y_pred:估計(jì)器預(yù)測目標(biāo)值

target_names:目標(biāo)類別名稱

return:每個(gè)類別精確率與召回率
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盆耽,隨后出現(xiàn)的幾起案子蹋砚,更是在濱河造成了極大的恐慌,老刑警劉巖征字,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件都弹,死亡現(xiàn)場離奇詭異娇豫,居然都是意外死亡匙姜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門冯痢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氮昧,“玉大人框杜,你說我怎么就攤上這事⌒浞剩” “怎么了咪辱?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長椎组。 經(jīng)常有香客問我油狂,道長,這世上最難降的妖魔是什么寸癌? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任专筷,我火速辦了婚禮,結(jié)果婚禮上蒸苇,老公的妹妹穿的比我還像新娘磷蛹。我一直安慰自己,他們只是感情好溪烤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布味咳。 她就那樣靜靜地躺著,像睡著了一般檬嘀。 火紅的嫁衣襯著肌膚如雪槽驶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天鸳兽,我揣著相機(jī)與錄音捺檬,去河邊找鬼。 笑死贸铜,一個(gè)胖子當(dāng)著我的面吹牛堡纬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒿秦,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼烤镐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棍鳖?” 一聲冷哼從身側(cè)響起炮叶,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渡处,沒想到半個(gè)月后镜悉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡医瘫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年侣肄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醇份。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稼锅,死狀恐怖吼具,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矩距,我是刑警寧澤拗盒,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锥债,受9級特大地震影響陡蝇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哮肚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一毅整、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绽左,春花似錦悼嫉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲁纠,卻和暖如春总棵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背改含。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工情龄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捍壤。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓骤视,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鹃觉。 傳聞我的和親對象是個(gè)殘疾皇子专酗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容