如何在Matplotlib绘图中展示Logistic回归的S型拟合曲线
错误原因
- 你代码中
plt.plot传入的y未定义,从报错维度推断你大概率错误传入了Y = model.predict(X_test)的结果:X_train有40条样本,X_test只有10条,二者长度不匹配直接画图就会触发维度错误 - 直接调用
predict()得到的是离散的分类结果(0/1),无法输出连续的S型概率曲线,需要调用predict_proba()获取正类的预测概率
修正后代码
%matplotlib inline import pandas as pd import numpy as np from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression # 数据读取与拆分 log_df = pd.read_csv("datalist/education/pollingData.csv") X_train, X_test, y_train, y_test = train_test_split(log_df[['PercentYes']], log_df.side_val, test_size=0.2) # 模型训练 model = LogisticRegression() model.fit(X_train, y_train) # 绘图部分 plt.figure(1, figsize=(4, 3)) plt.clf() # 绘制原始训练集散点 plt.scatter(X_train, y_train, color="black", marker='+', label='训练样本') # 生成连续的x取值区间,用于绘制平滑S曲线 x_range = np.linspace(X_train.min(), X_train.max(), 100).reshape(-1, 1) # 预测每个x值对应正类的概率,取结果第二列即类别1的概率值 y_sigmoid = model.predict_proba(x_range)[:, 1] # 绘制S型拟合曲线 plt.plot(x_range, y_sigmoid, color='red', label='拟合S曲线') plt.xlabel('PercentYes') plt.ylabel('分类概率') plt.legend() plt.show()
调整说明
- 生成覆盖训练集取值范围的100个连续x点,避免直接用离散训练集点绘制出现折线效果
- 用
predict_proba()获取正类的预测概率,输出的就是Logistic回归对应的S型sigmoid曲线值 - 连续x值通过
reshape(-1,1)转为sklearn要求的二维输入格式,避免传入一维序列触发格式报错
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

