教程目录
阅读:
逻辑回归算法实践(python实现方案)
有了前面章节的理论准备,接下来,我们利用已经完成的函数,构建 Logistic Regression 分类器。利用线性可分的数据作为训练样本来训练 Logistic Regression 模型,在构建模型的过程中,主要分为两个步骤:
1) 导入训练数据:
2) 利用梯度下降法对训练数据进行训练,以得到 Logistic Regression 算法的模型,即模型中的权重,程序代码为:
通过上述的训练,最终得到的 Logistic Regression 模型的权重为:
最终的分隔超平面如下图所示:
其次需要导入测试数据,如主程序中的程序段 2 所示,导入测试数据的函数 load_data 如下所示:
模型和测试数据都导入之后,需要利用模型对新的数据进行预测,如主程序中的程序段 3 所示,函数 predict 的实现如下所示:
最后,需要将预测的结果保存到文件中,如主程序中的代码段 4 所示,函数 save_result 的实现如下所示:
- 利用训练样本训练模型;
- 利用训练好的模型对新样本进行预测。
利用训练样本训练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 中。