cloudtone 发表于 2017-4-17 13:47:59

使用k-NN算法 诊断乳腺癌
Step 1- collecting data---收集数据
>wbcd<-read.csv("wisc_bc_data.csv");


step 2 - exploring and preparing the data--观察数据特征
>str(wbcd)
输出:图1
包含569个样本数据 每个样本数据有32个特征
第一个特征是ID该特征主要是用来标识每个独一无二的样本个体 对于我们的分析没有任何实际意义 因此需要将它剔除
>wbcd<-wbcd[-1]
第二个特征是diagnosis 这个代表该样本是良性还是恶性的 这个是我们需要预测的
>table(wbcd$diagnosis)
B    M
357 212
很多的R机器学习算法 要求目标特征是因子类型。因此我们需要将diagnosis这个特征转换成因子类型
>wbcd$diagnosis<-factor(wbcd$diagnosis, levels=c("B", "M"), labels=c("Benign", "Malignant"))
>round(prop.table(table(wbcd$diagnosis))*100, digits=1)
BenignMalignant
62.7       37.3


Transformation---- normalizing numeric data 数据的规范化
有些特征值的数据 取值范围相差太大这对于距离计算时 是不利的最终可能导致我们分类器的不准确

>normalize<-function(x){
return ( (x-min(x)) / ( max(x) - min(x) ) )
}


>wbcd_n<-as.data.frame(lapply(wbcd, normalize))
这样就将第2到31列的所有特征的取值范围 都固定在0到1之间

Data preparation - creating training and test datasets 创建训练和测试集
>wbcd_train<-wbcd_n
>wbcd_test<-wbcd_n
>wbcd_train_labels<-wbcd
>wbcd_test_labels<-wbcd


Step 3 - training a model on data通过数据集训练出一个模型
>wbcd_test_pred<-knn(train=wbcd_train, test=wbcd_test, cl=wbcd_train_labels, k=21)


Step 4 - evaluting model performance   模型评估
>CrossTable(x=wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
输出见图2:
通过图2可以看出 正确率为98%
误将良性诊断为恶性0%
误将恶性诊断为良性2%

Step 5 - improving model performance 模型改进
主要从2个方面:
1)使用其他的数据规范化函数
2)尝试使k取不同的值




cloudtone 发表于 2017-4-17 14:26:40

Chapter 4 Probabilistic Leaning--Classification Using Naive Bayes(使用朴素贝叶斯分类)朴素贝叶斯一个假设就是事件之间是相互独立的。公式如图1:
图中P(A|B)表示 事件B发生的条件下A发生的概率。也就是所谓的条件概率。因为假设事件是独立的。A发生是独立于B发生,根据贝叶斯公式要计算P(A|B)。就需要计算P(A∩B)(A和B同时发生的概率)


将公司转换成图2形式:


朴素贝叶斯算法的优缺点 见图3

cloudtone 发表于 2017-4-17 16:26:02

Example - filtering mobile phone spam with the Naive Bayes algorithm使用朴素贝叶斯分类垃圾信息
Step 1 - collecting data 收集数据
>sms_raw<- read.csv("sms_spam.csv", stringAsFactors=FALSE)


Step 2 - exploring and preparing the data 考察数据
>str(sms_raw)
输出见过:图1
将目标特征转换成 因子类型
>sms_raw$type<- factor(sms_raw$type)
>str(sms_raw$type)
Factor w/ 2 levels "ham", "spam":1 1 1 2 2 1 1 1 2 1.....
>table(sms_raw$type)
ham   spam
4812747

Data preparation- cleaning and standardizing text data 对文本数据进行清洗和规范化
>sms_corpus<- VCorpus(VectorSource(sms_raw$text))
使用text mining(tm包)创建一个文本集

1)将文本集中全部转换为小写
>sms_corpus_clean<- tm_map(sms_corpus, content_transformer(tolower))

2) 去除数字
>sms_corpus_clean<- tm_map(sms_corpus_clean, removeNumbers)

3) 去除停词
>sms_corpus_clean<- tm_map(sms_corpus_clean, removeWords, stopwords())

4) 去除标点符号
>sms_corpus_clean<- tm_map(sms_corpus_clean, removePunctuation)

5)去除一些变形形式如learninglearn learned learns 都是learn的变形形式
>sms_corpus_clean<- tm_map(sms_corpus_clean, stemDocument)

6)去除空格
>sms_corpus_clean<- tm_map(sms_corpus_clean, stripWhitespace)


Data preparation - splitting text documents into words将文本转换成单词矩阵
>sms_dtm<- DocumentTermMatrix(sms_corpus_clean)
如果 你之前没有对其中的文本做上面一系列的处理 可以使用以下方式转换成单词矩阵 效果是一样的
>sms_dtm<- DocumentTermMatrix(sms_corpus, control = list(tolower = TRUE, removeNumbers = TRUE, stopwords = TRUE, removePunctuation = TRUE, steming = TRUE))

Data preparation - creating training and test datasets创建训练集和测试集
>sms_dtm_train<- sms_dtm
>sms_dtm_test<_ sms_dtm
>sms_train_labels<- sms_raw$type
>sms_test_labels<- sms_raw$type

Visualizing text data - word clouds文本虚拟化-单词云
>wordcloud(sms_corpus_clean, min.freq = 50, random.order = FALSE)
输出如图2
也可以分别将不同分类的文本集虚拟化
>spam<- subset(sms_raw, type == "spam")
>ham<- subset(sms_raw, type == "ham")


>wordcloud(spam$text, max.words = 40, scale = c(3, 0.5))
>wordcloud(ham$text, max.words = 40,scale = c(3, 0.5))
输出分别为图3   图4




Data preparation - creating indicator features for frequent words 使用出现频率最高的单词作为分类的特征
>sms_freq_words<- findFreqTerms(sms_dtm_train, 5)
>sms_dtm_freq_train<- sms_dtm_train[, sms_freq_words]
>sms_dtm_freq_test<- sms_dtm_test[, sms_freq_words]
>convert_count<- function(x){
   x<- ifelse(x > 0, "Yes", "No")
}
>sms_train<- apply(sms_dtm_freq_train, MARGIN = 2, convert_counts)
>sms_test<- apply(sms_dtm_freq_test, MARGIN = 2, convert_counts)

Step 3 - training a model on the data训练模型
>sms_classifier<- naiveBayes(sms_train, sms_train_labels)


Step 4 - evaluting model performance 模型评估
>sms_test_pred<- predict(sms_classfifier, sms_test)
>CrossTable(sms_test_pred, sms_test_labels, prop.,chisq = FALSE, prop.t = FALSE, prop.r = FALSE, dnn = c('predict', 'actual'))


输出图5

从图中可以看出6+30 = 36条是分类错误的 总的样本是1390条。错误率为2.6%。其中6条正常信息 被划分为垃圾信息30条垃圾信息被划分为正常信息.


Step 5 - improving model performance 模型改进
页: 1 [2]
查看完整版本: 开始学习