线性回归代码实践

线性回归sklearn实现

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
#生成位于区间(-6,6)的等间隔的100个点
x = np.linspace(-6,6,100)
#生成对应的函数值
y = 0.5 * x + 2
#绘制直线图形
plt.plot(x,y)

结果如下:

#已知两点(2,3),(6,5),绘制一条直线
x = np.array([2,6])
y = np.array([3,5])
plt.plot(x,y)

运行结果如下:

 

 

#利用sklearn线性回归求直线斜率
from sklearn.linear_model import LinearRegression

属性:intercept:截距

           normalize:标准化

           copy_X:标准化后是否覆盖原数据

           n_jobs:设置计算任务个数

           coef_:feature系数,只能查看K值,不能看b值

           intercept_:查看b值

           rank_:查看矩阵的秩

           singular_:查看矩阵的奇异值

方法:fit:训练模型

           predict:模型预测

           score:模型评估

#线性回归模型实例化(输入系数矩阵x必须是矩阵,行数是样本数,列数是特征数)
lr = LinearRegression()
x = np.array([2,6])
y = np.array([3,5])
x = x.reshape(-1,1)
#模型训练
lr.fit(x,y)
print("过两点(2,3)与(6,5)的直线的斜率为:{},截距为:{:.2f}".format(lr.coef_,lr.intercept_))

 运行结果如下:

#模型预测
x_test = np.array([3,4,5]).reshape(-1,1)
y_predict = lr.predict(x_test)
#模型评估--计算R方值(不能说准确率)
lr.score(x,y)
#计算模型lr的均分误差
from sklearn.metrics import mean_squared_error
y = 0.5 * x_test + 2
mean_squared_error(y,y_predict)

 运行结果为1.0

                    6.573840876841765e-32

#假设有第三个点,坐标为(3,6)
x2 = np.array([[2],[3],[6]])
y2 = np.array([3,6,5])
#绘制三个点的散点图
plt.scatter(x2,y2,s=180,c='r')#s是点的大小,c是点的颜色

运行结果如下:

#利用线性回归模型拟合一条均方误差最小的直线
lr_2 = LinearRegression()
lr_2.fit(x2,y2)
y2_predict = lr_2.predict(x_test)
print(y2_predict)
print(lr_2.coef_,lr_2.intercept_)

 运行结果为[4.46153846 4.76923077 5.07692308]

                   [0.30769231] 3.5384615384615388

#绘制拟合出的直线
z = np.linspace(0.6,10)
z_predict = lr_2.predict(z.reshape(-1,1))
plt.plot(z,z_predict,lw=5,c='g')
plt.scatter(x2,y2,s=180,c='r')

运行结果:

#计算模型lr_2的R方系数
lr_2.score(x2,y2)
#计算模型lr_2的均方误差
from sklearn.metrics import mean_squared_error
mean_squared_error(y2,y2_predict)

运行结果为0.17582417582417564

                  1.2189349112426031

n_informative:每个样本有多少个特征,默认为10

n_targets:决定生成的目标变量的数量

noise:噪声点

#利用sklearn生成100条具有1个特征的回归分析数据集
X_3,y_3 = make_regression(n_samples=100,n_features=1)
plt.scatter(X_3,y_3)

运行结果如下:

X_3,y_3 = make_regression(n_samples=100,n_features=1,noise=50,random_state=8)
plt.scatter(X_3,y_3)

 运行结果如下:

X_3,y_3 = make_regression(n_samples=100,n_features=1,noise=50,bias=100,random_state=8)
plt.scatter(X_3,y_3)

 运行结果如下:

#利用线性回归模型对数据X_3,y_3进行拟合
#模型实例化
reg = LinearRegression()
#模型训练
reg.fit(X_3,y_3)
#绘制回归直线
z=np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X_3,y_3,c='orange',s=30)
plt.plot(z,reg.predict(z),c='g')
plt.title('Linear Regression')

 运行结果如下:

print('回归直线的斜率是:{:.2f}'.format(reg.coef_[0]))
print('回归直线的截距是:{:.2f}'.format(reg.intercept_))

运行结果为:回归直线的斜率是:68.78

                     回归直线的截距是:101.25

 糖尿病数据集的线性回归分析

#导入糖尿病数据集
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
print(diabetes['DESCR'])
X = diabetes.data#特征变量
y = diabetes.target#因变量
X.shape,y.shape

运行结果为:((442, 10), (442,))

#划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8)
#模型实例化+模型训练
lr = LinearRegression().fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lr.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lr.score(X_test,y_test)))

运行结果为:训练数据集得分:0.53

                      测试数据集得分:0.46

岭回归的sklearn实现

#导入岭回归模块
from sklearn.linear_model import Ridge
#模型实例化
ridge = Ridge()
#模型训练
ridge.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(ridge.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(ridge.score(X_test,y_test)))

运行结果为:训练数据集得分:0.43

                      测试数据集得分:0.43

#岭回归的参数调节
#正则化系数为10
ridge10 = Ridge(alpha=10).fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(ridge10.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(ridge10.score(X_test,y_test)))

运行结果为:训练数据集得分:0.15

                      测试数据集得分:0.16

#岭回归的参数调节
#正则化系数为0.1
ridge01 = Ridge(alpha=0.1).fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(ridge01.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(ridge01.score(X_test,y_test)))

运行结果为:训练数据集得分:0.52

                      测试数据集得分:0.47

#模型系数的可视化比较
plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')
plt.xlabel("系数序号")
plt.ylabel("系数量级")
plt.hlines(0,0,len(lr.coef_))
plt.legend(loc='best')
plt.grid(linestyle=':')

 运行结果如下:

#绘制学习曲线:取固定的alpha值,改变训练集的数据量
from sklearn.model_selection import learning_curve,KFold
def plot_learning_curve(est,X,y):
    training_set_size,train_scores,test_scores = learning_curve(
        est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,
                                                         random_state=1))
    estimator_name = est.__class__.__name__
    line = plt.plot(training_set_size,train_scores.mean(axis=1),'--',
                   label="training"+estimator_name)
    plt.plot(training_set_size,test_scores.mean(axis=1),'-',
            label="test"+estimator_name,c=line[0].get_color())
    plt.xlabel('Training set size')
    plt.ylabel('Score')
    plt.ylim(0,1.1)
plot_learning_curve(Ridge(alpha=1),X,y)
plot_learning_curve(LinearRegression(),X,y)
plt.legend(loc=(0,1.05),ncol=2,fontsize=11)
plt.grid(linestyle=':')

 运行结果如下:

 LASSO回归的sklearn实现

#导入LASSO回归模块
from sklearn.linear_model import Lasso
#模型实例化
lasso = Lasso()
#模型训练
lasso.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lasso.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lasso.score(X_test,y_test)))
#特征选择
print("套索回归使用的特征数:{}".format(np.sum(lasso.coef_!=0)))

 运行结果为:

训练数据集得分:0.36
测试数据集得分:0.37
套索回归使用的特征数:3

LASSO回归的参数调节

#增加最大迭代次数的默认设置,默认max_iter=1000
lasso = Lasso(max_iter=100000)
lasso.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lasso.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lasso.score(X_test,y_test)))
#特征选择
print("套索回归使用的特征数:{}".format(np.sum(lasso.coef_!=0)))

运行结果为:

训练数据集得分:0.36
测试数据集得分:0.37
套索回归使用的特征数:3
#增加最大迭代次数的默认设置,默认max_iter=1000
#同时调整alpha的值
lasso01 = Lasso(alpha=0.1,max_iter=100000).fit(X_train,y_train)
print("alpha=0.1时套索回归在训练数据集得分:{:.2f}".format(lasso01.score(X_train,y_train)))
print("alpha=0.1时套索回归在测试数据集得分:{:.2f}".format(lasso01.score(X_test,y_test)))
print("alpha=0.1时套索回归使用的特征数:{}".format(np.sum(lasso01.coef_!=0)))

运行结果为:

alpha=0.1时套索回归在训练数据集得分:0.52
alpha=0.1时套索回归在测试数据集得分:0.48
alpha=0.1时套索回归使用的特征数:7
#调整alpha的值为0.0001
lasso00001 = Lasso(alpha=0.0001,max_iter=100000).fit(X_train,y_train)
print("alpha=0.0001时套索回归在训练数据集得分:{:.2f}".format(lasso00001.score(X_train,y_train)))
print("alpha=0.0001时套索回归在测试数据集得分:{:.2f}".format(lasso00001.score(X_test,y_test)))
print("alpha=0.0001时套索回归使用的特征数:{}".format(np.sum(lasso00001.coef_!=0)))

运行结果为:

alpha=0.0001时套索回归在训练数据集得分:0.53
alpha=0.0001时套索回归在测试数据集得分:0.46
alpha=0.0001时套索回归使用的特征数:10
#模型系数的可视化比较
plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')
plt.plot(lasso.coef_,'D',label="Lasso alpha=1")
plt.plot(lasso01.coef_,'H',label="Lasso alpha=0.1")
plt.plot(lasso00001.coef_,'p',label="Lasso alpha=0.0001")
plt.plot(ridge01.coef_,'<',label="Ridge alpha=0.1")
plt.xlabel("系数序号")
plt.ylabel("系数量级")
plt.hlines(0,0,len(lr.coef_))
plt.legend(loc='best')
plt.grid(linestyle=':')

 运行结果如下:

 结论:LASSO回归相对于岭回归,更适合做特征选择

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用MATLAB中的高级优化算法来进行多云非线性回归。其中一种方法是使用L-BFGS算法,该算法可以自动选择一个合适的学习速率来最小化代价函数。以下是一个使用MATLAB进行多云非线性回归代码示例: ```matlab % 数据准备 X = your_feature_data; % 特征数据 y = your_target_data; % 目标数据 % 定义代价函数 cost_function = @(theta) your_cost_function(theta, X, y); % 初始化参数 initial_theta = your_initial_theta; % 设置优化选项 options = optimset('GradObj', 'on', 'MaxIter', 100); % 使用fminunc函数进行优化 = fminunc(cost_function, initial_theta, options); % 打印最优参数和最小代价 disp('最优参数:'); disp(theta); disp('最小代价:'); disp(cost); ``` 在上面的代码中,`your_feature_data`是你的特征数据,`your_target_data`是你的目标数据,`your_cost_function`是你自定义的代价函数,`your_initial_theta`是你的初始参数。你可以根据你的具体问题进行相应的替换和调整。 需要注意的是,这只是一个示例代码,你可能需要根据你的具体情况进行相应的修改和调试。另外,MATLAB中还有其他高级优化算法可供选择,如共轭梯度算法和局部优化法。你可以根据自己的需求选择适当的算法来求解你的非线性回归问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [吴恩达机器学习系列理论加实践(五/六 、逻辑回归及matlab实践)](https://blog.csdn.net/Enjoy_endless/article/details/86612918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [吴恩达(Andrew Ng)《机器学习》课程笔记(3) 第3周——逻辑回归](https://blog.csdn.net/zaishuiyifangxym/article/details/82110418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值