人工智能中文网
  • 主页
  • 线代考研视频
  • 线性代数
  • Python机器学习与算法
  • 大数据与机器学习
  • Python基础入门教程
  • 人工智能中文网
    教程目录
    阅读:

    逻辑回归算法实践(python实现方案)

    < 上一篇:梯度下降法 下一篇:Softmax Regression算法 >
    有了前面章节的理论准备,接下来,我们利用已经完成的函数,构建 Logistic Regression 分类器。利用线性可分的数据作为训练样本来训练 Logistic Regression 模型,在构建模型的过程中,主要分为两个步骤:
    1. 利用训练样本训练模型;
    2. 利用训练好的模型对新样本进行预测。

    利用训练样本训练Logistic Regression模型

    首先,我们利用训练样本训练模型,为了使得 Python 能够支持中文的注释和利用 numpy 工具,我们需要在训练文件“lr_train.py”的开始加入:
    #coding:UTF-8
    import numpy as np
    在训练模型中,其主函数为:
    if __name__ == "__main__":
    在主函数中,训练 LR 模型的主要步骤包括:
    1) 导入训练数据:
    print "------1.load data------"
    feature,label = load_data("data.txt")
    其中,导入数据的 load_data 函数实现为:
    def load—data(file_name):
        '''
        input: file_name (string)训练数据的位置
        output: feature_data (mat)特征 label_data (mat)标签
        '''
        f = open (file_name) # 打开文件
        feature_data =[]
        label_data =[]
        for line in f.readlines():
            feature_tmp =[]
            lable_tmp =[]
            lines = line.strip().split("//t")
            feature_tmp.append (1) # 偏置项
            for i in xrange(len(lines) - 1):
                feature_tmp.append(float(lines[i]))
                lable_tmp.append(float(lines[-1]))
    
                feature—data.append(feature_tmp)
                label_data.append(lable一tmp)
            f.close () #关闭文件
            return np.mat(feature一data), np.mat(label一data)
    在 load_data 函数中,其输入为训练数据所在的位置,其输出为训练数据的特征和训练数据的权重。

    2) 利用梯度下降法对训练数据进行训练,以得到 Logistic Regression 算法的模型,即模型中的权重,程序代码为:
    print "----2.training-----"
    w = lr_train_bgd(feature,label,1000,0.01)
    3) 将权重输出到文件 weights 中,程序代码为:
    print "----3.save model-----"
    save_model("weight",w);
    保存最终的模型的 save_model 函数如下所示:
    def save_model(file_name, w):
        '''保吞最终的模型in
        put: file_name (string):模型保存的文件名
        w (mat) :LR模型的权重
        '''
        m = np.shape(w) [0]
        f_w = open(file_name, "w")
        w_array =[]
        for i in xrange(m):
            w_array.append(str(w[i, 0]))
        f_w.write ("	",join(w_array))
        f w.close ()
    该程序中,函数 save_model 将训练好的 LR 模型以文件的形式保存,其中 save_model 函数的输入为保存的文件名 file_name 和所需保存的模型 w。

    最终的训练效果

    训练的具体过程为:


    通过上述的训练,最终得到的 Logistic Regression 模型的权重为:


    最终的分隔超平面如下图所示:

    对新数据进行预测

    对于分类算法而言,训练好的模型需要能够对新的数据集进行划分。利用上述步骤,我们训练好 LR 模型,并将其保存在“weights”文件中,此时,我们需要利用训练好的 LR 模型对新数据进行预测,同样,为了能够使用 numpy 中的函数和对中文注释的支持,在文件“lr_test.py”开始,我们加入:
    #coding:UTF-8
    import numpy as np
    主函数为:
    if __name__ =="__main__" :
        #1.导入 LR 模型
        print "----------1.load model------------"
        w = load_weight("weights")
        n = np.shape(w)[1]
        #2.导入测试数据
        print "----------2.load data------------"
        testData = load_data("test_data", n)
        #3.对测试数据进预测
        print "---------- 3.get prediction ------------"
        h = predict(testData, w)
        #4.保存最终的预测结果
        print "---------- 4.save prediction -----------"
        save_result("result",h)
    在对新数据集的预测中,首先是导入训练好的模型的参数,如程序段 1 所示,导入模型的函数 load_weight 如下所示:
    def load_weight(w):
        '''导入LR模型
        input: w( string)权重所在的文件位置
        output: np.mat(w)(mat)权重的矩阵
        '''
        f = open(w)
        w =[]
        for line in f.readlines():
            lines = line.strip().split("	")
            w_tmp =[]
            for x in lines:
                w_tmp.append(float(x))
            w.append(w_tmp)
        f.close()
        return np.mat(w)
    程序中,需要先导入 numpy 模块和 lr_train 中的 sig 函数。在 load_weight 函数中,其输入是权重所在的位置,在导入函数中,将其数值导入到权重矩阵中。

    其次需要导入测试数据,如主程序中的程序段 2 所示,导入测试数据的函数 load_data 如下所示:
    def load_data(file_name,n):
        '''导入测试数据
        input: file_name(string)测试集的位置
        n(int)特征的个数
        output:np.mat(feature_data)(mat)测试集的特征
        '''
        f = open(file_name)
        feature_data=[];
        for line in f.readlines();
            feature_tmp=[];
            lines = line.strip().split("	")
            #print lines[2]
            if len(lines) <>n-1:
                continue
            feature_tmp.append(1)
            for x in lines:
                #print x
                feature_tmp.appen(float(x))
            feature_data.append(feature_tmp)
        f.close()
        return np.mat(feature_data)
    在导入测试集的 load_data 函数中,其输入为测试集的位置和特征的个数,其中特征的个数用于判断测试集是否符合要求,如主程序中代码段 1 所示,若不符合要求,则丢弃。

    模型和测试数据都导入之后,需要利用模型对新的数据进行预测,如主程序中的程序段 3 所示,函数 predict 的实现如下所示:
    def predict(data,w):
        '''对测试数据进行预测
        input: data(mat)测试数据的特征
               w(mat)模型的参数
        output: h(mat)最终的预测结果
        '''
        h = sig(data * w.T) # 取得 sigmoid 值
        m = np.shape(h)[0]
        for i in xrange(m):
            if h[i,0] < 0.5:
                h[i,0] = 0.0
            else:
                h[i,0]=1.0
        return h
    在 predict 函数中,其输入为测试数据的特征和模型的权重,输出为最终的预测结果。通过特征与权重的乘积,再对其求 Sigmoid 函数值得到最终的预测结果。在此,使用到了文件“lr_train.py”中的 sig 函数,因此,在文件“lr_test.py”中,需要导入 sig 函数:
    from lr_train import sig
    在计算最终的输出时,为了将 Sigmoid 函数输出的概率值转换成 {0,1},通常可以取 0.5 作为边界。

    最后,需要将预测的结果保存到文件中,如主程序中的代码段 4 所示,函数 save_result 的实现如下所示:
    def save_result(file_name,result)
        '''保存最终的预测结果
        input: file_name(string):预测结果保存的文件名
               result(mat):预测的结果
        '''
        m = np.shape(result)[0]
        #输出预测结果到文件
        tmp = []
        for i in xrange(m);
            tmp.append(str(h[i,0]))
        f_result = open(file_name,"w")
        f_result.write("	",join(tmp))
        f_result.close()
    此程序中,函数 save_result 实现将预测结果存到指定的文件中,函数 save_result 的输入为预测结果保存的文件名 file_name 和预测的结果 result,最终将 result 中的数据写入到文件 file_name 中。
    < 上一篇:梯度下降法 下一篇:Softmax Regression算法 >