R成精-機器學習分類演算法

weixin_34290000發表於2017-11-29

1、演算法介紹

一個樣本對應一個分類,用訓練資料訓練一個分類器,在輸入沒有標籤的樣本時,將新資料與訓練集的資料對應特徵進行比較,找出“距離”最近的k個資料,選擇這k個資料中出現最多的分類作為新資料的分類。

演算法描述
  1. 計算已知類別資料及中的點與當前點的距離;
    距離計算方法有"euclidean"(歐氏距離),”minkowski”(明科夫斯基距離), "maximum"(切比雪夫距離), "manhattan"(絕對值距離),"canberra"(蘭式距離), 或 "minkowski"(馬氏距離)等.
  2. 按距離遞增次序排序
  3. 選取與當前點距離最小的k個點,
  4. 確定前K個點所在類別出現的頻率
  5. 返回頻率最高的類別作為當前類別的預測
特點

KNN是有監督的學習演算法,其特點有:

  1. 精度高,對異常值不敏感
  2. 只能處理數值型屬性
  3. 計算複雜度高(如已知分類的樣本數為n,那麼對每個未知分類點要計算n個距離)
存在的問題

KNN演算法目前存在的問題:

  1. k值的確定是個難題。
  2. 如果距離最近的k個已知分類樣本中,頻數較高的型別有多個(頻數相同),如何選擇對未知樣本的分類?目前看是隨機的。
  3. 如果有n個未知型別樣本,m個已知型別樣本,則需要計算n*m個距離,計算量較大,且需儲存全部資料集合,空間複雜度也較大。
  4. 能否把預測的樣本分類加入到已知類別集合中,對剩餘的未知型別樣本進行分類?
  5. 歸一化放在所有處理的最前面,這樣需要知道全部的樣本集合(已知分類+未知分類)來構建分類器,而實際上未知分類的樣本並不一定能事先獲得,這樣如何進行歸一化處理,任然是個問題。

應用領域:

  1. 計算機視覺:包含字元和麵部識別等
  2. 推薦系統:推薦受眾喜歡電影、美食和娛樂等
  3. 基因工程:識別基因資料的模式,用於發現特定的蛋白質或疾病等

2、R演算法

  1. class函式包中的knn、knn.cv函式;
  2. caret函式包中的knn3函式;
  3. kknn函式包中的kknn函式;
  4. ipred函式包中的ipredknn函式
  5. DMwR函式包中的kNN函式

3、案例

實驗環境
  • 作業系統:
Mac OS X High Sierra 10.13.1+2.5 GHz Intel Core i7+16 GB 1600 MHz DDR3
R version 3.4.2 (2017-09-28)
變數名 描述
Survived 生存 (1) or 死亡 (0)
Pclass 客艙等級
Name 姓名
Sex 性別
Age 年齡
SibSp 兄弟姐妹和夫妻數
Parch 父母和兒女數
Ticket 船票號
Fare 費用
Cabin 客艙號
Embarked 出發的港口
  • 程式程式碼
    #資料處理
library("class")
library("caret")
library("kknn")
library("ipred")
library("DMwR")#載入程式包
library('dplyr')
test<-read.csv("./test.csv",stringsAsFactors = F)
train<-read.csv("./train.csv",stringsAsFactors = F)
test$datatype<-"test"
train$datatype<-"train"
full  <-bind_rows(train, test)
full$Sex[full$Sex=="female"]<-1
full$Sex[full$Sex=="male"]<-0
full$Sex<-as.numeric(full$Sex)
full$Embarked [full$Embarked =="S"]<-1
full$Embarked [full$Embarked =="C"]<-2
full$Embarked [full$Embarked =="Q"]<-3
full$Embarked <-as.numeric(full$Embarked )
full$Age[is.na(full$Age)]<--1
full$Fare[is.na(full$Fare)]<-8.05
full$Embarked[is.na(full$Embarked)]<-2
full$Pclass<-as.numeric(full$Pclass)
full$SibSp<-as.numeric(full$SibSp)
full$Parch<-as.numeric(full$Parch)


train <- full[1:891,]
test <- full[892:1309,]

用Pclass 、Sex 、Age、SibSp、Parch 、Fare、Embarked進行建模

  1. 基於class 函式包knn實現
  1. 基於caret函式包中的knn3函式實現
  1. 基於kknn函式包中的kknn函式實現
  1. 基於ipred函式包中的ipredknn函式實現
  1. 基於DMwR函式包中的kNN函式實現

相關文章