zoukankan      html  css  js  c++  java
  • 机器学习简易入门(四)- logistic回归

    摘要:使用logistic回归来预测某个人的入学申请是否会被接受

    声明:(本文的内容非原创,但经过本人翻译和总结而来,转载请注明出处)

    本文内容来源:https://www.dataquest.io/mission/59/logistic-regression

     

    原始数据展示

    这是一份美国入学申请的录取记录表,admit – 是否录取,1代表录取,0代表否定;gpa – gpa成绩,gre – 绩点

    import pandas
    
    admissions = pandas.read_csv('admissions.csv')

    clip_image001

    在之前已经介绍过了线性回归,现在同样使用线性回归来进行预测

    from sklearn.linear_model import LinearRegression
    
    model = LinearRegression()
    
    #训练模型
    
    model.fit(admissions[['gre', 'gpa']], admissions["admit"])
    
    admit_prediction = model.predict(admissions[['gre', 'gpa']])
    
    plt.xlabel('gpa')
    
    plt.ylabel('admit_prediction')
    
    plt.scatter(admissions["gpa"], admit_prediction)
    
    plt.show()

    clip_image002

    在上图中可见,有些预测结果小于0,而这明显是不对的,因为预测结果应该只能为0或者1,我们现在需要获取一个介于0和1之间的概率,然后通过之前的文章中介绍过的分类算法(机器学习简易入门(二)- 分类)来确定录取一个人的概率的阀值来决定录取结果,最终生成只有0和1的结果

     

    logistic回归函数

    logistic回归产生的输出都位于0和1之间,通常用来产生预测某个事件的发生概率,该函数的格式为clip_image003,其中的e是一个无理数常量,该函数有一个很漂亮的形状

    # logistic回归函数
    
    def logit(x):
    
    return np.exp(x) / (1 + np.exp(x)) 
    
    # 在-6到6之间等差产生50个数
    
    t = np.linspace(-6,6,50, dtype=float)
    
    ylogit = logit(t)
    
    #作图
    
    plt.plot(t, ylogit, label="logistic")
    
    plt.ylabel("Probability")
    
    plt.xlabel("t")
    
    plt.title("Logistic Function")
    
    plt.show()

    clip_image004

    logistic回归

    在线性回归方程中clip_image005,可以将该方程产生的结果y放入到logistic回归方程,从而将线性方程产生的结果转换为一个概率clip_image006,对于本文来说,这个logistic回归方程为clip_image007,现在根据这个logistic回归方程就能产生一个录取概率。

    类似于之前使用scikit-learn库中的线性回归,现在也可以直接使用该库中的logistic回归

    from sklearn.linear_model import LogisticRegression
    
    #对数据集进行随机重排序
    admissions = admissions.loc[np.random.permutation(admissions.index)]
    
    # 将随机排序后的前700条数据作为训练集,后面的作为测试集
    num_train = 700
    data_train = admissions[:num_train]
    data_test = admissions[num_train:]
    
    logistic_model = LogisticRegression()
    logistic_model.fit(data_train[['gpa', 'gre']], data_train['admit'])
    
    # 进行测试
    fitted_test = logistic_model.predict_proba(data_test[['gpa', 'gre']])[:, 1] #因为predict_proba返回的是一个两列的矩阵,矩阵的每一行代表的是对一个事件的预测结果,第一列代表该事件不会发生的概率,第二列代表的是该事件会发生的概率。而这里需要的是第二列的数据
    plt.scatter(data_test['gre'], fitted_test)
    plt.xlabel('gre')
    plt.ylabel('probability ')
    plt.show()

    clip_image008

    评估模型

    准确率

    现在假设只要录取概率大于0.5的就能录取,计算一下这个模型的准确性

    # predict()函数会自动把阀值设置为0.5
    
    predicted = logistic_model.predict(data_train[['gpa','gre']])
    
    # 计算在训练集中正确预测的准确率
    
    accuracy_train = (predicted == data_train['admit']).mean()
    
    #计算在测试集中正确预测的准确率
    
    predicted = logistic_model.predict(data_test[['gpa','gre']])
    
    accuracy_test = (predicted == data_test['admit']).mean()

    clip_image009

    ROC曲线

    分别计算训练集和测试集的ROC曲线和AUC

    from sklearn.metrics import roc_curve, roc_auc_score
    
    train_probs = logistic_model.predict_proba(data_train[['gpa', 'gre']])[:,1]
    
    test_probs = logistic_model.predict_proba(data_test[['gpa', 'gre']])[:,1]
    
    #计算AUC
    
    auc_train = roc_auc_score(data_train["admit"], train_probs)
    
    auc_test = roc_auc_score(data_test["admit"], test_probs)
    
    print('Auc_train: {}'.format(auc_train))
    
    print('Auc_test: {}'.format(auc_test))
    
    # 计算ROC曲线
    
    roc_train = roc_curve(data_train["admit"], train_probs)
    
    roc_test = roc_curve(data_test["admit"], test_probs)
    
    # 作图
    
    plt.plot(roc_train[0], roc_train[1])
    
    plt.plot(roc_test[0], roc_test[1])

    clip_image010

  • 相关阅读:
    解决Servlet无法换行
    Servlet页面解析中文乱码问题
    IDEA2020版创建Servlet(Web项目)完整教程
    SPFA算法
    最短路算法Dijkstra
    搜索与图论总结
    Kruskal算法
    第10章 嵌入式Linux 的调试技术
    第9章 硬件抽象层:HAL
    第八章 让开发板发出声音:蜂鸣器驱动
  • 原文地址:https://www.cnblogs.com/kylinlin/p/5309703.html
Copyright © 2011-2022 走看看