近期课堂上学习了线性回归模型,同时也读到了很好的一篇文章,尝试对于里面的部分内容进行复现说明,简单总结,附上链接:https://mp.weixin.qq.com/s/qAzbL3YY30X7W9NkL9hb0A
线性趋势线图
alt text
线性趋势线图用于可视化数据集中自变量和因变量之间的线性关系,以及线性回归模型拟合的效果
反映线性关系
反映拟合效果
123456789101112131415161718192021222324252627282930from sklearn.datasets import load_diabetes# 导入数据集diabetes = load_diabetes() X = diabetes.data[:, 2] # 设第三个变量为Xy = diabetes.target # 利用公式实现线性回归算法拟合def linear_regression(X,y): X_mean = sum(X)/len(X) y_mean = sum(y)/len(y) # 求解斜率和截距 numerator = sum((X-X_mean) * (y-y_mean)) denominator = sum((X-X_mean)**2) slope = numerator / denominator # 斜率 intercept = y_mean - slope * X_mean # 截距 return slope, interceptslope,intercept = linear_regression(X,y)import seaborn as snsimport matplotlib.pyplot as pltsns.regplot(x=X,y=y,color='red',scatter_kws={'color':'blue','s':10}) # 设置 ci = None,不显示置信区间# scatter_kws和line_kws分别用于设置数据点和趋势线的颜色等属性plt.xlabel('X')plt.ylabel('y')plt.title('Linear trend line plot')plt.show()
残差图
alt text
残差图:残差是预测值和真实值之间的差值,残差图是残差和自变量之间的散点图,残差图可以反映线性回归模型的拟合效果,如果残差图没有集中,说明模型可能存在偏差,需要调整模型参数。
在理想情况下,残差应该随机地分布在横轴上,没有明显的模式
12345678910111213141516171819202122232425262728293031323334353637from sklearn.datasets import load_diabetes# 导入数据集diabetes = load_diabetes() X = diabetes.data[:, 2] # 设第三个变量为Xy = diabetes.target # 利用公式实现线性回归算法拟合def linear_regression(X,y): X_mean = sum(X)/len(X) y_mean = sum(y)/len(y) # 求解斜率和截距 numerator = sum((X-X_mean) * (y-y_mean)) denominator = sum((X-X_mean)**2) slope = numerator / denominator # 斜率 intercept = y_mean - slope * X_mean # 截距 return slope, intercept# 获取回归直线的斜率和截距slope,intercept = linear_regression(X,y)# 计算预测值y_pred = slope * X + intercept# 计算残差residuals = y - y_predimport matplotlib.pyplot as plt# 绘制残差图plt.scatter(X, residuals, color='blue')plt.axhline(y=0, color='red', linestyle='--') # 添加水平参考线plt.xlabel('X label')plt.ylabel('Residuals')plt.title('Residual plot')plt.show()
正态概率图
alt text
正态概率图(Normal probability
plot)是一种用于检验数据是否符合正态分布的图表
这里检验模型的残差是否符合正态分布
1234567891011121314# 部分代码同上...import scipy.stats as statsimport matplotlib.pyplot as plt# 计算残差residuals = y - y_pred# 绘制正态概率图stats.probplot(residuals, dist="norm", plot=plt)plt.xlabel('Theoretical quantiles')plt.ylabel('Ordered residuals')plt.title('Normal probability plot')plt.show()
学习曲线
alt text
学习曲线(Learning
curve)是一种展示模型在训练集和验证集上表现随训练样本数量变化的图表。它通常将训练集和验证集的误差(如均方误差)或准确率作为纵轴,训练样本数量作为横轴,可以帮助我们分析模型的拟合情况和泛化能力。
在线性回归中,学习曲线可以帮助我们判断模型是否过拟合或欠拟合。 当模型在训练集上表现良好但在验证集上表现较差时,可能存在过拟合;而当模型在两个集合上表现都较差时,可能存在欠拟合。通过观察学习曲线,可以调整模型的复杂度或者增加训练样本数量来改善模型的表现。
学习曲线可以帮助我们分析模型在不同训练样本数量下的表现,进而判断模型是否过拟合或欠拟合
1234567891011121314151617181920212223242526272829303132333435from sklearn.datasets import load_diabetesfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import learning_curveimport matplotlib.pyplot as pltimport numpy as np# 加载数据diabetes = load_diabetes()X = diabetes.data[:,2] # 选择一个特征y = diabetes.target# 创建线性回归模型并训练model = LinearRegression()# 计算学习曲线train_sizes,train_scores,valid_scores = learning_curve(model,X[:,np.newaxis],y,train_sizes=[50,100,200,300],cv=5) # 训练样本数量为50、100、200、300 # 计算训练集和验证集的平均误差train_mean=np.mean(train_scores,axis=1)train_std=np.std(train_scores,axis=1)valid_mean=np.mean(valid_scores,axis=1)valid_std=np.std(valid_scores,axis=1)# 绘制学习曲线plt.figure()plt.title("Learning Curve")plt.xlabel("Training examples")plt.ylabel("Score")plt.grid() # 显示网格plt.fill_between(train_sizes,train_mean-train_std,train_mean+train_std,alpha=0.1,color="r") # 填充训练集的误差plt.fill_between(train_sizes,valid_mean-valid_std,valid_mean+valid_std,alpha=0.1,color="g") # 填充验证集的误差plt.plot(train_sizes,train_mean,"o-",color="r",label="Training score") # 绘制训练集的得分plt.plot(train_sizes,valid_mean,"o-",color="g",label="Cross-validation score") # 绘制验证集的得分(使用交叉验证)plt.legend(loc="best") # 显示图例plt.show() # 显示图
还有一些感觉用处不大就不详细学习了,日后有需要再看