线性回归

作者: 仙灵儿 | 来源:发表于2018-08-16 23:31 被阅读4次

    【关键词】最小二乘法,线性

    插入一些好用的知识点

    np.random.permutation(210)  # 产生 0到209 一共210个值 打乱顺序 (只是顺序乱了 值不会重复也不会少)
    samples = samples.take(np.random.permutation(210))  # 按照随机索引的顺序 去样本中取数据 (只是顺序乱了 样本不会多也不会少)samples = samples.take(np.random.permutation(210))  # 按照随机索引的顺序 去样本中取数据 (只是顺序乱了 样本不会多也不会少)
    
    #  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
    # train_test_split函数 参数: X 特征数据集 y 结果集合 test_size测试集占的比例 random_state对随机数的设定
    # 返回值 分别是X_train, X_test, y_train, y_test这样的顺序 (一定要注意这个顺序)
    X_train, X_test, y_train, y_test = train_test_split(data,target,test_size=0.1,random_state=42)
    

    一、普通线性回归

    1、原理

    分类的目标变量是标称型数据,而回归将会对连续型的数据做出预测。

    应当怎样从一大堆数据里求出回归方程呢?

    假定输人数据存放在矩阵X中,而回归系数存放在向量W中。那么对于给定的数据X1, 预测结果将会通过

    Y=X*W

    给出。现在的问题是,手里有一些X和对应的Y,怎样才能找到W呢?

    一个常用的方法就是找出使误差最小的W。这里的误差是指预测Y值和真实Y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我 们采用平方误差。

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    # 使用机器学习模型来拟合这些点
    from sklearn.linear_model import LinearRegression
    

    2. 糖尿病严重程度预测

    获取糖尿病数据

    # 糖尿病的数据集 是sklearn的datasets里面自带的
    import sklearn.datasets as datasets
    diabetes = datasets.load_diabetes()
    diabetes
    
    data = diabetes.data  # 数据
    data
    feature_names = diabetes.feature_names  # 特征名
    target = diabetes.target  # 目标值
    

    创建数学模型

    lr = LinearRegression()
    lr.fit(data,target)  # 传入各个样本的特征 和 结果值
    w = lr.coef_  # 斜率
    b = lr.intercept_  # 截距
    

    第二步:预测

    # 随机产生一个索引 按照索引从原来的样本中抽取一个数据
    # 看带入模型后算出的结果 和 真实值的偏差
    index = np.random.randint(0,442,size=1)[0]
    index
    data[index]
    target[index]
    # 根据 机器学习模型 计算出来的 截距和斜率 还有 随机抽取的那个样本的特征值 去计算结果
    y_ = np.dot(w,data[index]) + b
    # 看看预测出来的结果和真实结果 差别大不大
    y_
    print('真实的结果是:',target[index])
    print('回归的结果是:',y_)
    lr.predict(data[index].reshape(1,-1))
    

    第三步:绘制图形(研究某一特征和糖尿病严重程度的关系)

    # 把 bmi拿出来
    bmi_data = data[:,2]
    # 机器学习模型 需要的都是 二维的数据
    # 每一行是一个样本 每一列是一个特征
    # bmi_data是很多样本的 bmi这一个特征 所以要变形
    bmi_data = bmi_data.reshape(-1,1)
    
    X_test = bmi_data  # 特征
    y_test = target  # 目标值
    plt.scatter(X_test,y_test)
    lr = LinearRegression()
    lr.fit(X_test,y_test)
    w = lr.coef_
    b = lr.intercept_
    y_ = w*X_test + b
    y_
    plt.scatter(X_test,y_test)
    plt.plot(X_test,y_,color='green')
    

    二、岭回归

    1、原理

    缩减系数来“理解”数据

    如果数据的特征比样本点还多应该怎么办?是否还可以使用线性回归和之前的方法来做预测?

    答案是否定的,即不能再使用前面介绍的方法。这是因为输入数据的矩阵X不是满秩矩阵。非满秩矩阵在求逆时会出现问题。

    为了解决这个问题,统计学家引入了岭回归(ridge regression)的概念

    缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果。

    岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。

    归纳总结

    1.岭回归可以解决特征数量比样本量多的问题

    2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果

    3.缩减算法可以看作是对一个模型增加偏差的同时减少方差

    岭回归用于处理下面两类问题:

    1.数据点少于变量个数

    2.变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大)

    # 还是从sklearn.linear_model里面引入 只不过引入的是Ridge函数
    from sklearn.linear_model import Ridge
    
    # alpha=1.0 指定就是 引入的误差的大小 alpha越大 引入的误差就越大
    rr = Ridge(alpha=10000)
    # 如果不引入偏差 各个特征的权重和普通线性回归完全一样
    # 如果偏差太大 所有特征的权重就几乎没有了
    rr.fit(data,target)
    rr.coef_
    rr.intercept_
    lr = LinearRegression()
    lr.fit(data,target)
    lr.coef_
    lr.intercept_
    

    相关文章

      网友评论

        本文标题:线性回归

        本文链接:https://www.haomeiwen.com/subject/kfeabftx.html