机器学习03-线性回归(python)

为什么W是向量,为什么会变成向量呢

只要你的目标值是连续的,就可以用(在机器学习中)
比如:
1.钢轨伸缩长度与温度 
2. 昆虫鸣叫次数与天气  
3.国内GDP与双十一销售额  
概念: 
主要是算法去计算斜率和截距,然后使用算法去预测。
from sklearn.linear_model import LinearRegression
def dm01_预测身高():
    # 1. 准备身高和体重
    x = [[160],[166],[172],[174],[180]]
    y = [56.3,60.6,65.1,68.5,75]
    
    # 2.实例化线性回归模型
    estimator = LinearRegression()
    # 3. 训练
    estimator.fit(x,y)
    
    # 4.打印参数模型
    print(estimator.coef_)
    print(estimator.intercept_)
    
    # 5.模型预测
    myres = estimator.predict([[176]])
    print(myres)
    
dm01_预测身高()

问题:

1. 样本会有多条数据

2. 已经知道每两个点会有一条直线

3. 那么怎么找到那一条让更多点经过的直线的呢?(最优直线)

求: 损失函数最小值的时候,就是那条最优直线 ( K 和 B 从数据中学习的参数 ,如果调优也是计算机学习调优。和超参数这种人工设定是有区别的。)

用偏导数求损失函数 偏导 等于0的时候的 K 和 B

损失函数什么时候使用呢? 

答案: 调优的时候,怎么调优呢?

   

直接背诵这些公式,根据这些公式去计算求导数。

设计神经网络的时候,必须要把前一个矩阵的列数。= 后一个矩阵的行数。

      

梯度下降算法:
 
目前用的比较多的是,小批量梯度下降算法
虽然很想用全梯度下降算法。目前由于资源有限,没法支持,所以基本都是使用小批量下降算法(mi ni-bantch)
通常只用梯度下降,因为目前数据量特别大,而且方程那种可能无法计算出来。
统一量纲,所以开根号
不能说 RMSE是更好的指标。每个应用都有自己的作用
from sklearn.preprocessing import StandardScaler        # 特征处理
from sklearn.model_selection import train_test_split    # 数据集划分
from sklearn.linear_model import LinearRegression       # 正规方程的回归模型
from sklearn.linear_model import SGDRegressor           # 梯度下降的回归模型
from sklearn.metrics import mean_squared_error          # 均方误差评估


import pandas as pd
import numpy as np

data_url = 'http://lib.stat.cmu.edu/datasets/boston'
raw_df = pd.read_csv(data_url,sep="\s+",skiprows=22,header=None)
data = np.hstack([raw_df.values[::2,:],raw_df.values[1::2,:2]])
target = raw_df.values[1::2,2]

# 2 数据集划分
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2,random_state=22)
# 4. 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 5.模型训练
# 正规方程法
LR = LinearRegression()
LR.fit(x_train, y_train)
print(LR.intercept_)
print(LR.coef_)

# 6.模型预测
y_predict = LR.predict(x_test)

# 7.模型评估
print(mean_squared_error(y_predict, y_test))

from sklearn.preprocessing import StandardScaler        # 特征处理
from sklearn.model_selection import train_test_split    # 数据集划分
from sklearn.linear_model import LinearRegression       # 正规方程的回归模型
from sklearn.linear_model import SGDRegressor           # 梯度下降的回归模型
from sklearn.metrics import mean_squared_error          # 均方误差评估
import pandas as pd
import numpy as np

data_url = 'http://lib.stat.cmu.edu/datasets/boston'
raw_df = pd.read_csv(data_url,sep="\s+",skiprows=22,header=None)
data = np.hstack([raw_df.values[::2,:],raw_df.values[1::2,:2]])
target = raw_df.values[1::2,2]

# 2 数据集划分
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2,random_state=22)
# 4. 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 5.模型训练
# 梯度下降法
# LR = LinearRegression()
LR = SGDRegressor(max_iter=100, learning_rate='constant',eta0=0.001)
LR.fit(x_train, y_train)
print(LR.intercept_)
print(LR.coef_)

# 6.模型预测
y_predict = LR.predict(x_test)

# 7.模型评估
print(mean_squared_error(y_predict, y_test))

欠拟合,所以需要加特征

继续加特征会过拟合


​​​​​​​

# 导包
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 创建数据
np.random.seed(666)
x =np.random.uniform(-3,3,size=100)
print(x.shape)
y = 0.5*x**2+x+2+np.random.normal(0,1,size=100)
# 模型训练
X = x.reshape(-1,1)
# print(X.shape)
X2 = np.hstack([X,X**2])
X3 = np.hstack([X,X**2,X**3,X**4,X**10,X**5,X**6,X**7,X**8,X**9,X**11])

LR =LinearRegression()
LR.fit(X3,y)
# 模型预测
y_predict =LR.predict(X3)
# 模型评估
print(mean_squared_error(y, y_predict))
# 可视化
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color = 'r')
plt.show()

可以看到前面的权重都为0或者趋向于0,后面的也弱化了。
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt

def dm04_模型过拟合_L1正则化():
    # 1 准备数据x y(增加上噪声)
    np.random.seed(666)
    x = np.random.uniform(-3, 3, size=100)
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)

    # 2 对数据进行标准化
    X = x.reshape(-1, 1)
    X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])  # 数据增加二次项
    scaler = StandardScaler()
    X3 = scaler.fit_transform(X3)

    # 3 实例化L1正则化模型
    estimator = Lasso(alpha=0.005)  # 去掉 normalize 参数

    # 4 训练模型
    estimator.fit(X3, y)
    print('estimator.coef_', estimator.coef_)

    # 5 模型预测
    y_predict = estimator.predict(X3)

    # 6 计算均方误差
    myret = mean_squared_error(y, y_predict)
    print('myret-->', myret)

    # 7 画图
    plt.scatter(x, y)
    # 画图时输入的x数据: 要求是从小到大
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    plt.show()

dm04_模型过拟合_L1正则化()

from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt

def dm05_模型过拟合_L2正则化():
    # 1 准备数据x y(增加噪声)
    np.random.seed(666)
    x = np.random.uniform(-3, 3, size=100)
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)

    # 2 手动标准化数据
    X = x.reshape(-1, 1)
    X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])  # 增加高次项
    scaler = StandardScaler()
    X3 = scaler.fit_transform(X3)

    # 3 实例化L2正则化模型(去掉normalize=True)
    estimator = Ridge(alpha=0.005)

    # 4 训练模型
    estimator.fit(X3, y)
    print('estimator.coef_', estimator.coef_)

    # 5 模型预测
    y_predict = estimator.predict(X3)

    # 6 计算均方误差
    myret = mean_squared_error(y, y_predict)
    print('均方误差 (MSE):', myret)

    # 7 画图
    plt.scatter(x, y)
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    plt.show()

# 调用函数
dm05_模型过拟合_L2正则化()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值