2018-08-01 19:59:39 imHery 阅读数 302
  • 机器学习入门30天实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 系列课程包含Python机器学习库,机器学习经典算法原理推导,基于真实数据集案例实战3大模块。从入门开始进行机器学习原理推导,以通俗易懂为基础形象解读晦涩难懂的机器学习算法工作原理,案例实战中使用Python工具库从数据预处理开始一步步完成整个建模工作!具体内容涉及Python必备机器学习库、线性回归算法原理推导、Python实现逻辑回归与梯度下降、案例实战,信用卡欺诈检测、决策树与集成算法、支持向量机原理推导、SVM实例与贝叶斯算法、机器学习常规套路与Xgboost算法、神经网络。

    7604 人正在学习 去看看 唐宇迪

目前为止,我们将每个词出现与否作为一个特征,叫做词集模型

def setOfWords2Vec(vocabList, inputSet):#输入:词表向量+待测文本向量
    returnVec = [0]*len(vocabList)
    for eachWord in inputSet:
        if eachWord in vocabList:
            returnVec[vocabList.index(eachWord)] = 1
        else: print "the word: %s is not in my Vocabulary!" % eachWord
    return returnVec#返回词表0/1向量,反映那些词汇在文档中是否出现

但是如果一个词在文档中出现不止一次,我们需要词袋模型

 

def bagOfWords2VecMN(vocabList, inputSet):#反映词表中单词在文档中出现次数
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec#返回数字向量

其实函数基本是一样的,只不过词袋模型返回的是每个词在文档中出现的次数

def textParse(bigString):    #input is big string, #output is word list
    import re
    listOfTokens = re.split(r'\W*', bigString)
    return [tok.lower() for tok in listOfTokens if len(tok) > 2] 

这里用到了正则表达式和列表解析的知识,有兴趣的可以去看。总之,函数功能是 :

返回字符串列表,去掉少于2个字符的字符串,并全部转为小写

现在,电子邮件分别位于spam和ham两个文件夹中,一个是垃圾邮件,一个是正常邮件,各25个

现在使用朴素贝叶斯进行交叉验证

意思说从中一部分用来训练,一部分用来测试,下面取40个训练,10个测试

def spamTest():
    docList=[]
    classList = []
    fullText =[]
    
    for i in range(1,26):
        #读取垃圾邮件
        wordList = textParse(open('c://Users//Hery//email//spam//%d.txt' % i).read())
        docList.append(wordList)  #list-list
        fullText.extend(wordList) #list
        classList.append(1)
        #读取正常邮件
        wordList = textParse(open('c://Users//Hery//email//ham//%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    
    vocabList = createVocabList(docList)#词表向量

    trainingSet = range(50)#50个号码
    testSet=[]             #创建测试集
    for i in range(10):    #随机抽取10个号码
        randIndex = int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])  
    trainMat=[]
    trainClasses = []
    for docIndex in trainingSet:#range(50)剩下的40个号码
        trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
        trainClasses.append(classList[docIndex])
    p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses))
    
    errorCount = 0
    for docIndex in testSet:    #10个随机号码
        wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
        if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
            errorCount += 1
            print "classification error\n",docList[docIndex]
            print "classify value:",classifyNB(array(wordVector),p0V,p1V,pSpam)
            print "real value:",classList[docIndex]
            print "***********************************************************"
    print 'the error rate is: ',float(errorCount)/len(testSet)
    #return vocabList,fullText

测试结果每次都会不一样,因为训练集和测试集不确定

测试之后,当然可以再写个函数,把全部50个作为训练集,自己输入一个文档,让分类器进行分类。

2017-09-06 11:15:01 gyh_420 阅读数 353
  • 机器学习入门30天实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 系列课程包含Python机器学习库,机器学习经典算法原理推导,基于真实数据集案例实战3大模块。从入门开始进行机器学习原理推导,以通俗易懂为基础形象解读晦涩难懂的机器学习算法工作原理,案例实战中使用Python工具库从数据预处理开始一步步完成整个建模工作!具体内容涉及Python必备机器学习库、线性回归算法原理推导、Python实现逻辑回归与梯度下降、案例实战,信用卡欺诈检测、决策树与集成算法、支持向量机原理推导、SVM实例与贝叶斯算法、机器学习常规套路与Xgboost算法、神经网络。

    7604 人正在学习 去看看 唐宇迪

本次实验是使用生成学习算法来处理数据(筛选垃圾邮件)。
判别学习算法(discriminative learning algorithm):直接学习p(y|x)(比如说logistic回归)或者说是从输入直接映射到{0,1}.
生成学习算法(generative learning algorithm):对p(x|y)(和p(y))进行建模,比如高斯判别法(GDA)和朴素贝叶斯法,前者是用来处理连续数据的,后者是用来处理离散数据的。
简单的来说,判别学习算法的模型是通过一条分隔线把两种类别区分开,而生成学习算法是对两种可能的结果分别进行建模,然后分别和输入进行比对,计算出相应的概率。
比如说良性肿瘤和恶性肿瘤的问题,对良性肿瘤建立model1(y=0),对恶性肿瘤建立model2(y=1),p(x|y=0)表示是良性肿瘤的概率,p(x|y=1)表示是恶性肿瘤的概率,然后根据贝叶斯公式(Bayes rule)推导出恶性肿瘤的概率:p(y=1|x),贝叶斯公式如下:
这里写图片描述
本次实验主要是使用朴素贝叶斯法处理离散数据,高斯判别法类似,只是参数的计算方法不同。
题目如下:
这里写图片描述
数据链接:
http://openclassroom.stanford.edu/MainFolder/courses/MachineLearning/exercises/ex6materials/ex6DataPrepared.zip
原题链接:
http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex6/ex6.html
原理:
这里就不给出详细的概念和推导了,想要了解的可以查阅其他资料,这里直接给出计算朴素贝叶斯参数的公式并做个解释:
这里写图片描述
这里1{…}表达式的意思:1{true}=1 , 1{false}=0
m代表有m个特征值(x),φj表示第j个特征向量xj的概率,^表示and的意思,所以我们在使用的时候就是算出xj的个数,除以分母即是φj|y=1和φj|y=0的值。
然后根据公式:
这里写图片描述
可以得到n个特征量对应的概率,注意这里公式上面的x是向量x,因为我们对朴素贝叶斯的假设是各特征量之间是独立的,所以计算概率可以进行乘法计算。
因为在甄别过程中还可能碰到没有加入过的特征量,但是如果按照之前的公式就会计算出0概率,而实际上这是不合理,所以需要引入拉普拉斯平滑
这里写图片描述
最后给出我们实验中用到的公式:
这里写图片描述
这里写图片描述
m代表有m个文本,本试验中有700的文本用例,k代表的是对应的特征词,ni表示第i个文本中有ni个特征词,V代表的是特征数量。
最后转换成对数进行计算:
这里写图片描述
训练部分的代码:

% train.m
% Exercise 6: Naive Bayes text classifier

clear all; close all; clc

% store the number of training examples
numTrainDocs = 700;

% store the dictionary size
numTokens = 2500;

% read the features matrix
M = dlmread('train-features.txt', ' ');
spmatrix = sparse(M(:,1), M(:,2), M(:,3), numTrainDocs, numTokens);
train_matrix = full(spmatrix);

% train_matrix now contains information about the words within the emails
% the i-th row of train_matrix represents the i-th training email
% for a particular email, the entry in the j-th column tells
% you how many times the j-th dictionary word appears in that email



% read the training labels
train_labels = dlmread('train-labels.txt');
% the i-th entry of train_labels now indicates whether document i is spam


% Find the indices for the spam and nonspam labels
spam_indices = find(train_labels);
nonspam_indices = find(train_labels == 0);

% Calculate probability of spam
prob_spam = length(spam_indices) / numTrainDocs;

% Sum the number of words in each email by summing along each row of
% train_matrix
email_lengths = sum(train_matrix, 2);%得到每个邮件中的特征词的个数,ni个
% Now find the total word counts of all the spam emails and nonspam emails
spam_wc = sum(email_lengths(spam_indices));%代表∑1{y(i)=1}ni 
nonspam_wc = sum(email_lengths(nonspam_indices));%代表∑1{y(i)=0}ni 

% Calculate the probability of the tokens in spam emails
%对应于∑∑1{xj^i=K and y(i)=1}+1 
prob_tokens_spam = (sum(train_matrix(spam_indices, :)) + 1) ./ ...
    (spam_wc + numTokens);
% Now the k-th entry of prob_tokens_spam represents phi_(k|y=1)

% Calculate the probability of the tokens in non-spam emails
prob_tokens_nonspam = (sum(train_matrix(nonspam_indices, :)) + 1)./ ...
    (nonspam_wc + numTokens);
% Now the k-th entry of prob_tokens_nonspam represents phi_(k|y=0)

分类测试部分的代码:

% test.m
% Exercise 6: Naive Bayes text classifier

% read the test matrix in the same way we read the training matrix
N = dlmread('test-features.txt', ' ');
spmatrix = sparse(N(:,1), N(:,2), N(:,3));
test_matrix = full(spmatrix);

% Store the number of test documents and the size of the dictionary
numTestDocs = size(test_matrix, 1);
numTokens = size(test_matrix, 2);


% The output vector is a vector that will store the spam/nonspam prediction
% for the documents in our test set.
output = zeros(numTestDocs, 1);

% Calculate log p(x|y=1) + log p(y=1)
% and log p(x|y=0) + log p(y=0)
% for every document
% make your prediction based on what value is higher
% (note that this is a vectorized implementation and there are other
%  ways to calculate the prediction)
log_a = test_matrix*(log(prob_tokens_spam))' + log(prob_spam);
log_b = test_matrix*(log(prob_tokens_nonspam))'+ log(1 - prob_spam);  
output = log_a > log_b;


% Read the correct labels of the test set
test_labels = dlmread('test-labels.txt');

% Compute the error on the test set
% A document is misclassified if it's predicted label is different from
% the actual label, so count the number of 1's from an exclusive "or"
numdocs_wrong = sum(xor(output, test_labels))

%Print out error statistics on the test set
fraction_wrong = numdocs_wrong/numTestDocs


这里写图片描述
注意这个地方的test_matrix为我们测试用的数据,代表了xk,那么我们需要通过φk|y=1 ^num(xk)=P(x|y=1)来换算得到,注意这里的x是向量,num表示k特征值出现的次数,因为是独立的,所以是连乘换算得到。

最后把结果和人工甄别的结果做个对比
这里写图片描述
误检率:1.9%

2017-07-29 17:13:26 yyq675886993 阅读数 545
  • 机器学习入门30天实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 系列课程包含Python机器学习库,机器学习经典算法原理推导,基于真实数据集案例实战3大模块。从入门开始进行机器学习原理推导,以通俗易懂为基础形象解读晦涩难懂的机器学习算法工作原理,案例实战中使用Python工具库从数据预处理开始一步步完成整个建模工作!具体内容涉及Python必备机器学习库、线性回归算法原理推导、Python实现逻辑回归与梯度下降、案例实战,信用卡欺诈检测、决策树与集成算法、支持向量机原理推导、SVM实例与贝叶斯算法、机器学习常规套路与Xgboost算法、神经网络。

    7604 人正在学习 去看看 唐宇迪
import numpy
from os import listdir
import jieba
import operator
from gensim import corpora,models,similarities
from numpy import *

#贝叶斯算法的实现
class Bayes:
    def __init__(self):
        self.length=-1
        self.labelcount=dict()
        self.vectorcount=dict()#key:value,{label:vect}
    def fit(self,dataSet,labels):
        if(len(dataSet)!=len(labels)):
            raise ValueError("您输入的类别与我们的数据集个数不匹配")
        self.length=len(dataSet[0])
        labelsnum=len(labels)#数据记录数量,类别总数量
        norelabel=set(labels)#不重复类别数组
        for item in norelabel:
            thislabel=item
            #当前类别占总类别的比例,当前类别的概率
            self.labelcount[thislabel]=labels.count(thislabel)/labelsnum#当前类别出现的概率
        for vect,label in zip(dataSet,labels):
            if(label not in self.vectorcount):
                self.vectorcount[label]=[]
            self.vectorcount[label].append(vect)
        print("训练结束")
        return self
    def btest(self,TestData,labelSet):
        if(self.length==-1):
            raise ValueError("没有训练,先训练再测试")
        #计算当前数据分别为各个类别的概率
        lbdict=dict()
        for thislb in labelSet:
            p=1 
            labelpct=self.labelcount[thislb]
            allvector=self.vectorcount[thislb]
            vnum=len(allvector)#取出当前向量列表的长度
            allvector=numpy.array(allvector).T
            for index in range(0,len(TestData)):
                vector=list(allvector[index])
                p=p*vector.count(TestData[index])/vnum
            lbdict[thislb]=p*labelpct
        #取出概率最大的那个类别
        thislabel=sorted(lbdict,key=lambda x:lbdict[x],reverse=True)[0]
        return thislabel


#进行训练
#从文件名得到分类信息
def seplabel(fname):
    filestr=fname.split(".")[0]
    thislabel=filestr.split("_")[0]
    if(thislabel=="t"):
        classstr=1
    else:
        classstr=0
    return classstr

#建立词典
dictdata=""
filelist=listdir("D:/python/train")
for i in range(0,len(filelist)):
    data=open("D:/python/train"+filelist[i],"r",encoding="utf-8").read()
    cdata=jieba.cut(data)
    for j in cdata:
        dictdata=dictdata+j+"  "
texts=[dictdata.split()]
dictionary=corpora.Dictionary(texts)


#构建训练集数据向量以及对应的label
def traindataSet():
    labels=[]
    dirname="D:/python/train"
    trainfilelist=listdir(dirname)
    #print(trainfilelist)
    m=len(trainfilelist)
    trainMat=numpy.zeros((m,2048))
    for i in range(0,m):
        fnamestr= trainfilelist[i]
        labels.append(seplabel(fnamestr))
        data=open(dirname+fnamestr,"r",encoding="utf-8").read()
        cutdata=jieba.cut(data)
        newdata=""
        for item in cutdata:
            newdata+=item+" "
        print(newdata)
        #将对应的数据转为稀疏向量
        new_vect=dictionary.doc2bow(newdata.split())
        #print(new_vect)
        thisvec=""
        for t in range(0,len(new_vect)):
            for k in range(0,len(new_vect[t])):
                thisvec=thisvec+str(new_vect[t][k])+"  "
        new_vec=thisvec.split()
        #print(new_vec)
        trainMat[i,:len(new_vec)]=new_vec
    return labels,trainMat

#接下来进行贝叶斯算法训练
labels,trainMat=traindataSet()
bys=Bayes()
bys.fit(trainMat,labels)
#测试
testdata=open("D:/python/test/abc1.txt","r",encoding="utf-8").read()
cutdata=jieba.cut(testdata)
newdata=""
for i in cutdata:
    newdata+=i+"  "
new_vec=dictionary.doc2bow(newdata.split())
thisvec=""
for t in range(0,len(new_vec)):
    for k in range(0,len(new_vec[t])):
        thisvec=thisvec+str(new_vec[t][k])+"  "
new_vec2=thisvec.split()
#print(new_vec)
testMat=numpy.zeros((1,2048))
testMat[0,:len(new_vec2)]=new_vec2
labels=[0,1]
rst=bys.btest(testMat[0],labels)
  if(rst==1):
    print("不是垃圾邮件")
  else:
    print("是垃圾邮件")
2017-09-05 14:25:48 dangyalingengjia 阅读数 2036
  • 机器学习入门30天实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 系列课程包含Python机器学习库,机器学习经典算法原理推导,基于真实数据集案例实战3大模块。从入门开始进行机器学习原理推导,以通俗易懂为基础形象解读晦涩难懂的机器学习算法工作原理,案例实战中使用Python工具库从数据预处理开始一步步完成整个建模工作!具体内容涉及Python必备机器学习库、线性回归算法原理推导、Python实现逻辑回归与梯度下降、案例实战,信用卡欺诈检测、决策树与集成算法、支持向量机原理推导、SVM实例与贝叶斯算法、机器学习常规套路与Xgboost算法、神经网络。

    7604 人正在学习 去看看 唐宇迪

学习了一点机器学习的内容:如何进行垃圾邮件分类。自己总结了一下。
试想一下我们人脑的思考方式,我们是如何判断一封邮件是垃圾邮件的:如果邮件中包含某些词,而且这些词出现的频率较高时(比如一封很短的邮件中只有几个Html标签,其中还包含“中奖”等词汇),我们把它归为“奇怪邮件”一类。当我们看了很多这样的“奇怪邮件”之后,我们判定这类邮件是我们所不需要的“垃圾邮件”,好在现在的邮箱都有垃圾箱可以帮我们分类。但是某一天我们收到腾讯客服的电话,我们真的中奖了,电话中说他们已经发了一封简短的邮件通知我,这是才焕然大悟,是不是那封邮件被当作垃圾邮件了,我们需要重新审视我们的分类标准。
那我们来试着模拟人脑的这个过程:
1,首先提取分类特征
首先需要获得一个垃圾邮件样本,然后统计样本中所有邮件中每一个单词出现的频率,并进行排序。从而得到分类特征词。
2,根据特征值计算新邮件是垃圾邮件的可能性。
新邮件中出现了某些“垃圾邮件特征词”,如何断定它是不是垃圾邮件呢。我们可以通过计算它是垃圾邮件的概率来判断。即计算出现特征词w1,…wn时,该邮件是垃圾邮件的条件概率。
介绍一下贝叶斯定理:
下面的图片截取自:http://www.chepoo.com/naive-bayesian-text-classification-algorithm-to-learn.html
贝叶斯定理
最终得出:
P(是垃圾邮件 | 含特征词w1,…wn) = P(含特征词w1 | 是垃圾邮件)*…P(wn | 是垃圾邮件) * P(是垃圾邮件) / (P(w1) * … P(wn))
如果此概率大于50%,我们认为是垃圾邮件。
注意:
这里如果某个P(含特征词w1 | 是垃圾邮件)为0的话,会使得最终结果为0,这被称为数据稀疏问题。为了解决这个问题,我们让每个特征词最少出现一次。
3,解决误杀和漏杀的问题。
如果确定有误杀及漏杀的情况,如何改进此模型呢?
这里猜测一下,是否可以通过调整P(w1 | 是垃圾邮件),来调整w1的判定权重呢?待以后学习后更新。

2019-06-04 14:25:59 zhangdy12307 阅读数 199
  • 机器学习入门30天实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 系列课程包含Python机器学习库,机器学习经典算法原理推导,基于真实数据集案例实战3大模块。从入门开始进行机器学习原理推导,以通俗易懂为基础形象解读晦涩难懂的机器学习算法工作原理,案例实战中使用Python工具库从数据预处理开始一步步完成整个建模工作!具体内容涉及Python必备机器学习库、线性回归算法原理推导、Python实现逻辑回归与梯度下降、案例实战,信用卡欺诈检测、决策树与集成算法、支持向量机原理推导、SVM实例与贝叶斯算法、机器学习常规套路与Xgboost算法、神经网络。

    7604 人正在学习 去看看 唐宇迪

Spark机器学习之垃圾邮件分类

步骤概述

通过HashingTF构建文本的特征向量,然后使用随机梯度下降算法实现逻辑回归,进而对邮件进行分类

垃圾邮件分类代码

导入相关的包
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.feature.HashingTF
import org.apache.spark.mllib.classification.LogisticRegressionWithSGD
加载文件
val spam = sc.textFile("file://media/hadoop/Ubuntu/spam.txt")
val normal = sc.textFile("file:///media/hadoop/Ubuntu/normal.txt")

其中spam.txt和normal.txt文件如下
spam.txt
在这里插入图片描述
normal.txt
在这里插入图片描述

创建一个HashingTF实例把邮件文本映射到包含1000个特征的向量
val tf = new HashingTF(numFeatures = 10000)
将邮件文本切分为单词,将每个单词映射为一个特征
val spamFeatures = spam.map(email => tf.transform(email.split(" ")))
val normalFeatures = normal.map(email => tf.transform(email.split(" ")))
创建LabeledPoint数据集分别存放垃圾邮件和正常邮件例子
val positiveExamples = spamFeatures.map(features => LabeledPoint(1, features))
val negativeExamples = normalFeatures.map(features => LabeledPoint(0, features))
val trainingData = positiveExamples.union(negativeExamples)
trainingData.cache()
使用SGD算法运行逻辑回归
val model = new LogisticRegressionWithSGD().run(trainingData)
使用例子进行测试
val posTest = tf.transform(
"O M G GET cheap stuff by sending money to ...".split(" "))
val negTest = tf.transform(
"Hi Dad, I started studying Spark the other ...".split(" "))
println("Prediction for positive test example: " + model.predict(posTest))
println("Prediction for negative test example: " + model.predict(negTest))

结果如下

在这里插入图片描述

没有更多推荐了,返回首页