机器学习之线性回归

相关性

相关性系数-1到1,正数是正相关,负数是负相关,数越大相关性越强,相关系数为1,表示两个数据成线性关系,0表示完全不相关,负数表示相反。

SVD的提法 奇异值分解

在这里插入图片描述

机器学习模型:线性回归/逻辑回归

y:
离散:分类
连续:回归
截距:就是我们选取的特征值进行各种加权平均,进行拟合之后,都无法拟合y值,从而造成的一个偏移量 。整体性的系统偏移,叫做截距
方差:即偏离程度。方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数

针对具体的数据如何选择合适的预处理方式?

根据经验

多种误差怎么判断拟合效果?

回归:MSE,MAE,误差平方和
分类:精确度,正确率,召回率

在这里插入图片描述

安装 机器学习的包: pip install scikit-learn

在建模的过程中,刚开始虽然建模错了,但是模型在学习过程中,会自动的进行分析,让其不那么错。

如图所示:当使用线性函数去表示二次函数的时候,使其斜率不变向下平移,得到该截距。
在这里插入图片描述

线性回归的代码实现

  1. data_generator2.py : 生成数据

import os
import cv2
import numpy as np
import pandas as pd
from PIL import Image
import matplotlib.pyplot as plt

if __name__ == '__main__':
    d = np.random.random((1000, 5))
    print(d)
    data = pd.DataFrame(d, index=np.arange(2021, 2021-d.shape[0], -1), columns=list('东南西北中'))
    data['Y'] = data['东']**2 - 3*data['南'] + 4*data['西'] - 6*data['北']
    data['Y'] += np.random.random(d.shape[0])*0.2
    print(data)
    data.to_excel('result.xls', sheet_name='DATA', index=True)


  1. linear_regression_intro.py
from sklearn.linear_model import LinearRegression
# 对数据进行预处理
from sklearn.preprocessing import PolynomialFeatures, StandardScaler, MinMaxScaler
from sklearn.metrics import mean_absolute_error,  mean_squared_error
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
import pandas as pd
import numpy as np

# 线性回归

if __name__ == '__main__':
    # 使得输出的数字为小数的形式
    np.set_printoptions(suppress=True)
    # 读取result.xls文件
    data = pd.read_excel('result.xls')
    print(data)

    # # 第一种方式:设置x
    # data['东2'] = data['东'] ** 2
    # data['南2'] = data['南'] ** 2
    # data['西2'] = data['西'] ** 2
    # data['北2'] = data['北'] ** 2
    # data['中2'] = data['中'] ** 2
    # x = data[['东2', '南2', '西2', '北2', '中2', '东', '南', '西', '北', '中']]

    # # 第二种方式设置X
    # pf = PolynomialFeatures(degree=2) # 对多项式值进行一个2次的生成,预处理。就不用自己输入各种格式了
    # t = pf.fit_transform(data[['东', '南', '西', '北', '中']])

    # # 将设置x,以及创建模型,合并到一个管道中去
    model = Pipeline(
        [('poly', PolynomialFeatures(degree=2)),
         # ('pca', PCA(n_components=10)),
         ('linear_regression', LinearRegression())]
    )

    x = data[['东', '南', '西', '北', '中']]
    y = data['Y']
    print(y)

    # 使用线性回归模型
    # model = LinearRegression()

    # 使用fit()输入训练数据,线性回归的所有理论,fit()函数全部实现了
    model.fit(x, y)
    linear_regression = model.get_params()['linear_regression']


    # 线性回归的方程式的系数和对应的截距
    print('系数:', linear_regression.coef_)
    print('截距:', linear_regression.intercept_)
    # 模型的预测值
    y_pred = model.predict(x)
    print(y_pred)


     # 衡量模型好坏的度量
    print('误差平方和SSE:', np.sum((y - y_pred) ** 2))
    # 均方误差:越小,模型越好
    print('MSE:', np.mean((y - y_pred) ** 2))
    # print('MSE(System): ', mean_squared_error(y, y_pred))
    print('MAE:', np.mean(np.abs(y - y_pred)))
    # print('MAE:(System) ', mean_absolute_error(y, y_pred))

线性回归理论

损失函数(目标函数)
特征值
权重
方差
交叉验证

解析式的求解过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
选最优的,使用交叉验证,直接调用一个函数即可。

最优解都已经知道了,那机器学习算法中是不是不需要梯度下降法逐步学习参数吗?

还是需要梯度下降,进行降维的。当维度在百维之内,可以直接算(直接算的方法就是:参数解析式公式,如上所示)。如果维度是千万维,则需要进行梯度下降。

求模型,需要求θ,求θ需要求超参数λ。。。。。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
进行交叉验证的代码

# coding: utf-8
# @Time: 2021/1/8 20:11
# @Author: zou wei
# @File: linear_regression_intro.py
# @Contact: visio@163.com
# @Software: PyCharm

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures, StandardScaler, MinMaxScaler
from sklearn.metrics import mean_absolute_error,  mean_squared_error
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
import pandas as pd
import numpy as np
from sklearn.linear_model import Ridge, Lasso
from sklearn.linear_model import LogisticRegression, Ridge
from sklearn.model_selection import GridSearchCV, train_test_split


if __name__ == '__main__':
    np.set_printoptions(suppress=True)
    data = pd.read_excel('result.xls')
    print(data)
    data['东2'] = data['东'] ** 2
    data['南2'] = data['南'] ** 2
    data['西2'] = data['西'] ** 2
    data['北2'] = data['北'] ** 2
    data['中2'] = data['中'] ** 2
    x = data[['东2', '南2', '西2', '南', '西', '北']
    y = data['Y']
    # 将数据分成训练集,测试集,test_size=0.2占百分之20。random_state要赋任意一个值,保证随机数相同。
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
    ridge = Ridge()
    # 对超参数进行交叉验证,cv=3进行3折交叉验证,超参数λ取值:np.logspaces(-4,4,20),表示取10的-4次方到10的4次方中取20个数
    model = GridSearchCV(ridge, param_grid={'alpha': np.logspace(-4, 4, 20)}, cv=3)
    model.fit(x_train, y_train)
   
    print('最优参数:', model.best_params_)
    print('系数:', model.best_estimator_.coef_)
    print('截距:', model.best_estimator_.intercept_)
    # 预测值
    y_train_pred = model.predict(x_train)
    
    # print('SSE:', np.sum((y - y_pred) ** 2))
    # print('MSE:', np.mean((y - y_pred) ** 2))
    print('训练集MSE: ', mean_squared_error(y_train, y_train_pred))
    # print('MAE:', np.mean(np.abs(y - y_pred)))
    print('训练集MAE: ', mean_absolute_error(y_train, y_train_pred))
    y_test_pred = model.predict(x_test)
    print('测试集MSE: ', mean_squared_error(y_test, y_test_pred))
    print('测试集MAE: ', mean_absolute_error(y_test, y_test_pred))

梯度下降算法

梯度下降算法:批量梯度下降算法,随机梯度下降算法
随机梯度下降算法:1个样本进行随机梯度下降,折中梯度下降

梯度下降算法是我们进行求解得到损失函数最小值的最直接的一个办法

在这里插入图片描述
代码实现

import numpy as np
import matplotlib.pyplot as plt
import math

if __name__ == '__main__':

    x = np.linspace(0,1,100)
    y = x ** x
    plt.plot(x, y ,'r-',lw = 3)
    plt.show()

    # 初值,自己取
    x = 1
    # 超参数(学习率),自己写一个值
    learning = 0.1
    # 迭代,求x的最小值
    for i in range(2000):
        x = x - learning * (math.log(x) + 1) * x ** x
        print(i,x)

神经网络使用随机梯度下降算法,参数batch_size表示选取几个样本,epochs:表示使用几轮

在这里插入图片描述

机器学习:逻辑回归模型

逻辑回归是进行分类的

线性回归所用到的知识点,梯度下降算法,正则项,最大似然函数等都能够迁移到逻辑回归中去。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
线性回归机器学习中的一种基本算法,梯度下降法是线性回归中常用的优化算法。下面是线性回归梯度下降法的实现步骤: 1.读取数据集,包括自变量和因变量。 2.初始化相关参数,包括学习率、迭代次数、截距和斜率等。 3.定义计算代价函数,常用的代价函数是均方误差(MSE)。 4.梯度下降,通过不断迭代更新截距和斜率,使得代价函数最小化。 5.执行梯度下降算法,得到最优的截距和斜率。 下面是Python代码实现: ```python import numpy as np # 读取数据集 def load_data(file_path): data = np.loadtxt(file_path, delimiter=',') x_data = data[:, :-1] y_data = data[:, -1] return x_data, y_data # 初始化相关参数 def init_params(): b = 0 k = 0 learning_rate = 0.01 num_iterations = 1000 return b, k, learning_rate, num_iterations # 定义计算代价函数 def compute_cost(b, k, x_data, y_data): total_error = 0 for i in range(len(x_data)): total_error += (y_data[i] - (k * x_data[i] + b)) ** 2 cost = total_error / float(len(x_data)) return cost # 梯度下降 def gradient_descent(b, k, x_data, y_data, learning_rate, num_iterations): m = float(len(x_data)) for i in range(num_iterations): b_gradient = 0 k_gradient = 0 for j in range(len(x_data)): b_gradient += (1/m) * ((k * x_data[j] + b) - y_data[j]) k_gradient += (1/m) * ((k * x_data[j] + b) - y_data[j]) * x_data[j] b = b - (learning_rate * b_gradient) k = k - (learning_rate * k_gradient) return b, k # 执行梯度下降算法 def linear_regression(file_path): x_data, y_data = load_data(file_path) b, k, learning_rate, num_iterations = init_params() print("Starting parameters: b = {0}, k = {1}, cost = {2}".format(b, k, compute_cost(b, k, x_data, y_data))) b, k = gradient_descent(b, k, x_data, y_data, learning_rate, num_iterations) print("After {0} iterations: b = {1}, k = {2}, cost = {3}".format(num_iterations, b, k, compute_cost(b, k, x_data, y_data))) # 调用线性回归函数 linear_regression('data.csv') ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值