1.1、Logistics Regression算法实践
有了上篇博客的理论准备后,接下来,我们用以及完成的函数,构建Logistics Regression分类器。我们利用线性可分的数据作为训练样本来训练。在构建模型的过程中,主要有两个步骤:(1)利用训练样本训练模型,(2)利用训练好的模型对新样本进行预测。
1.1.1、利用训练样本训练Logistics Regression模型
训练模型的主函数:
if __name__=="__main__":
print("------------1.load data----------------")
#导入数据
feature,lable = load_data("data.txt")
print("------------2.training-----------------")
#训练模型
w = lr_train_bgd(feature,lable,1000,0.01)
print("------------3.save model---------------")
#保存数据
save_model("weights",w)
保存数据模块函数:
def save_model(file_name,w): ''' :param file_name: #模型文件的保存名 :param w: #模型的权重 :return: ''' m = np.shape(w)[0] f_w = open(file_name,'w') w_array = [] for i in range(m): w_array.append(str(w[i,0])) f_w.write(' '.join(w_array)) f_w.close()
加载数据的函数:
def load_data(file_name): ''' :param file_name: 训练数据的位置 :return: 特征,标签 ''' f = open(file_name) feature_data = [] lable_data = [] for line in f.readlines(): feature_tmp = [] lable_tmp = [] lines = line.strip().aplit(" ") feature_tmp.append(1)#偏置项 for i in range(len(lines)-1): feature_tmp.append(float(lines[i])) lable_tmp.append(float(lines[-1])) feature_data.append(feature_tmp) lable_data.append(lable_tmp) f.close() return np.mat(feature_data),np.mat(lable_data)
训练结果:
最终得到的Logistics Regression模型的权重为:
最终分隔超平面为:
1.1.2对数据进行预测:
对于分类算法而言,训练好的模型需要能够对新的数据集进行划分。利用上述步骤,我们训练好LR模型,并将其保存再“weights”文件中。此时我们队训练好的文件进行预测。
预测的主函数:
if __name__=="__main__": #导入LR模型 print("---------------------1.load model----------") w = load_weight("weights") n = np.shape(w)[1] #导入测试数据 print("---------------------2.load data-----------") testData = load_data("test_data",n) #队测试数据进行预测 print("---------------------3.get prediction------") h = predict(testData,w) #保存最终数据 print("---------------------4.save prediction-----") save_result("result",h)
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)
Loda_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.append(float(x)) feature_data.append(feature_tmp) f.close() return np.mat(feature_data)
predict函数:
def predict(data, w): '''对测试数据进行预测 input: data(mat)测试数据的特征 w(mat)模型的参数 output: h(mat)最终的预测结果 ''' h = sig(data * w.T)#sig m = np.shape(h)[0] for i in range(m): if h[i, 0] < 0.5: h[i, 0] = 0.0 else: h[i, 0] = 1.0 return h
save_result函数:
def save_result(file_name, result): '''保存最终的预测结果 input: file_name(string):预测结果保存的文件名 result(mat):预测的结果 ''' m = np.shape(result)[0] #输出预测结果到文件 tmp = [] for i in range(m): tmp.append(str(result[i, 0])) f_result = open(file_name, "w") f_result.write(" ".join(tmp)) f_result.close()
测试结果:
生成了一个result.txt文件:
结果为: