摘要:使用logistic回归来预测某我的的入学申请是否会被接受html
声明:(本文的内容非原创,但通过本人翻译和总结而来,转载请注明出处)git
本文内容来源:https://www.dataquest.io/mission/59/logistic-regression算法
原始数据展现dom
这是一份美国入学申请的录取记录表,admit – 是否录取,1表明录取,0表明否认;gpa – gpa成绩,gre – 绩点机器学习
import pandas admissions = pandas.read_csv('admissions.csv')
在以前已经介绍过了线性回归,如今一样使用线性回归来进行预测函数
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()
在上图中可见,有些预测结果小于0,而这明显是不对的,由于预测结果应该只能为0或者1,咱们如今须要获取一个介于0和1之间的几率,而后经过以前的文章中介绍过的分类算法(机器学习简易入门(二)- 分类)来肯定录取一我的的几率的阀值来决定录取结果,最终生成只有0和1的结果学习
logistic回归函数测试
logistic回归产生的输出都位于0和1之间,一般用来产生预测某个事件的发生几率,该函数的格式为,其中的e是一个无理数常量,该函数有一个很漂亮的形状spa
# 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()
logistic回归翻译
在线性回归方程中,能够将该方程产生的结果y放入到logistic回归方程,从而将线性方程产生的结果转换为一个几率
,对于本文来讲,这个logistic回归方程为
,如今根据这个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()
评估模型
准确率
如今假设只要录取几率大于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()
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])