1.2、Logistics Regression算法实践

 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('\t'.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("\t")
        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("\t")
        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("\t")
        # 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("\t".join(tmp))
    f_result.close()

测试结果:

生成了一个result.txt文件:

结果为:

 

posted @ 2018-05-28 13:53  田湾第一帅  阅读(262)  评论(0编辑  收藏  举报