sklearn多项式回归和线性回归

2023-12-20 22:21:01

什么是线性回归?

回归分析是一种统计学方法,用于研究自变量和因变量之间的关系。它是一种建立关系模型的方法,可以帮助我们预测和解释变量之间的相互作用。
回归分析通常用于预测一个或多个因变量的值,这些因变量的值是由一个或多个自变量的值所决定的。回归分析的目标是建立一个数学模型来描述因变量和自变量之间的关系。
这个数学模型可以是线性或非线性的,可以包含一个或多个自变量。通过回归分析,我们可以使用已知的自变量和因变量值来计算模型参数,然后使用这些参数来预测因变量值。
回归分析被广泛应用于各种领域,包括经济学、社会学、医学、环境科学和工程学等。它可以用于研究许多不同的问题,如房价预测、销售预测、股票价格预测、人口增长预测等等。

线性回归需要满足的条件:
(1)自变量和因变量在理论上有因果关系;

(2)因变量为连续型变量;

(3)各自变量与因变量之间存有线性关系;

(4)残差要满足正态性、独立性、方差齐性。

(5)多个自变量不存在多重共线性

其中,线性(Linear)、正态性(Normal)、独立性(independence)、方差齐性(Equal Variance),俗称LINE,是线性回归分析的四大基本前提条件。

?sklearn的线性回归:

  • 准备工作
  • from sklearn.linear_model import LinearRegression
  • 创建模型:?linear =LinearRegression()
  • 拟合模型:?linear.fit(x,y)
  • 模型的预测值:?linear.predict(输入数据)
  • 线性回归模型的权重linear.coef_和偏置linear.intercept_

class sklearn.linear_model.LinearRegression (fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

?

参数

含义

fit_intercept:布尔值,可不填,默认为True是否计算此模型的截距。如果设置为False,则不会计算截距

normalize:布尔值,可不填,默认为False,当fit_intercept设置为False时,将忽略此参数。如果为True,则特征矩阵X在进入回归之前将会被减去均值(中心化)并除以L2范式(缩放)。如果你希望进行标准化,请在fit数据之前用preprocessing模块中的标准化专用类StandardScaler

copy_X:布尔值,可不填,默认为True,如果为真,将在X.copy()上进行操作,否则的话原本的特征矩阵X可能被线性回归影响并覆盖

n_jobs:整数或者None,可不填,默认为None,用于计算的作业数。只在多标签的回归和数据量足够大的时候才生效。除非None在joblib.parallel_backend上下文中,否则None统一表示为1。如果输入 -1,则表示使用全部的CPU来进行计算。

?线性回归代码:

线性回归直接预测血糖值
    :return: None
    """
    # 获取数据
    lb = readcvs()
    # print(lb)
    # 分割数据集到训练集和测试集,按照75%:25%的比例进行数据分配训练数据和测试数据
    x_train, x_test, y_train, y_test = train_test_split(lb['data'], lb['target'], test_size=0.2)
    # 进行标准化处理(目标值要进行标准化处理)
    # 特征值和目标值都必须进行标准化处理, 实例化两个标准化API
    # 标准化也就是归一化处理
    # std_x = StandardScaler()
    # # 标准化训练数据
    # x_train = std_x.fit_transform(x_train)
    # # 标准化测试数据
    # x_test = std_x.transform(x_test)
    #
    # # 目标值
    # std_y = StandardScaler()
    # # 标准化目标训练数据(因为数据是[y,y,1,1,1,1,...]变换成[[],[],[],[],[]...])进行变换
    # y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    # # 标准化目标测试数据(同上)
    # y_test = std_y.transform(y_test.reshape(-1, 1))

    # estimator预测
    # 正规方程求解方式预测结果
    
    lr = LinearRegression()
    print("多项式参数:",l_data)
    # 对训练数据进行拟合
    lr.fit(x_train, y_train)


    # # 查看w的参数
    print('w参数',lr.coef_)
    # # 查看b的参数
    print('b参数',lr.intercept_)
    
    # 保存训练模型
    # 预测测试集的房子价格
    # y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
    y_lr_predict = lr.predict(x_test)
    print("正规方程测试集里面每个血糖的预测: ", y_lr_predict)
    # print("正规方程的均方误差: ", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
    score_ = lr.score(x_test, y_test)
    print('模型得分', score_)

    # 保存血糖模型数据
    if score_ > 0.2:
        joblib.dump(lr, "./model/blood.pkl")

    return score_


def train_():
    count=0
    sys.setrecursionlimit(100000)  # 设置递归深度
    list=[]
    #循环10000次
    for i in range(10000):
        score = train()
        list.append(score)
        count = count+1
        print("最高得分", max(list))
        if score>0.2:
            break
    print("最高得分",max(list))

#加载模型准备预测
def predict():
    list=[[1, 80.0, 179, 55,421,0]]
    value=np.array(list)
    # 导入血糖模型数据
    lr = joblib.load("./model/blood.pkl")
    #直接预测结果
    y_lr_predict=lr.predict(value)
    print(y_lr_predict)
    #返回模型预测出来的血糖值
    return y_lr_predict

if __name__ == "__main__":
   train_()

多项式回归:

多项式回归:
from sklearn.preprocessing import PolynomialFeatures
# 设置多项式阶数为2,其他值默认
# degree 多项式阶数
poly = PolynomialFeatures(degree=2)
res = poly.fit_transform(X)
PolynomialFeatures详细探讨
现在有(a,b)两个特征,使用degree=2的二次多项式则为(1,a, a^2, ab, b ,b^2)。
PolynomialFeatures主要有以下几个参数:

degree:度数,决定多项式的次数

interaction_only: 默认为False,字面意思就是只能交叉相乘,不能有a^2这种.

include_bias: 默认为True, 这个bias指的是多项式会自动包含1,设为False就没这个1了.

order:有"C" 和"F" 两个选项。官方写的是在密集情况(dense case)下的输出array的顺序,F可以加快操作但可能使得subsequent estimators变慢。

如何控制多项式回归的系数:a=[[2,3]] 或者a=[[2],[3]]

from sklearn.preprocessing import PolynomialFeatures
a=[[2,3]](相当于[[x1,x2]])
pf=PolynomialFeatures(degree=2)
print(pf.fit_transform(a)) #会产生多项式的系数
#[[1. 2. 3. 4. 6. 9.]] 相当于(1+2+3+2*2+2*3+3*3)
pf=PolynomialFeatures(degree=2,include_bias=False)
print(pf.fit_transform(a))
#[[2. 3. 4. 6. 9.]]
pf=PolynomialFeatures(degree=2,interaction_only=True)
print(pf.fit_transform(a))
#[[1. 2. 3.  6.]]

如果是c=[[a],[b]]这种形式,生成的多项式就没有ab交叉项了,只有[[1,a,a^2], [1,b,b^2]] 。
c=[[2],[3]]
print(pf.fit_transform(c))
[[1. 2. 4.][1. 3. 9.]]

转换器Transformers 通常与分类器、回归器或其他估计器相结合,构成一个复合估计器。最常见的工具是pipeline。

利用Pipline进项多项式和线性回归合并,这样会产生非线性的回归

lr = Pipeline([
        ('poly', PolynomialFeatures(degree=2)),
        ('clf', LinearRegression())
    ])
lr.fit(x_train, y_train)
多项式和线性回归相结合
lr = LinearRegression()
pf=PolynomialFeatures(degree=2)
lr.fit(pf.fit_transform(X), y)
print(lr.coef_)
print(lr.intercept_)
对应w和b(对应多项式的斜率和截距)
[0.1  1.413  -0.435]
-1.584092

回归的俩中线性和非线性:

# 线性回归
clf1 = LinearRegression()
clf1.fit(x, y)
y_l = clf1.predict(x)  # 线性回归预测值
 
# 非线性回归
ployfeat = PolynomialFeatures(degree=3)  # 根据degree的值转换为相应的多项式(非线性回归)
x_p = ployfeat.fit_transform(x)
clf2 = LinearRegression()
clf2.fit(x_p, y)

文章来源:https://blog.csdn.net/chehec2010/article/details/135114178
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。