ML十大算法之线性回归

用此算法前要注意其前提条件:是否为线性回归?
因此,我们要遵循一定的条件
1.线性回归是一个回归问题。
2.要预测的变量 y 与自变量 x 的关系是线性的(图2 是一个非线性)。
3.各项误差服从正太分布,均值为0,与 x 同方差(图4 误差不是正太分布)。
4.变量 x 的分布要有变异性。
5.多元线性回归中不同特征之间应该相互独立,避免线性相关。

区分回归与分类
分类回归的区别在于输出变量的类型。 定量输出称为回归,或者说是连续变量预测; 定性输出称为分类,或者说是离散变量预测。 举个例子: 预测明天的气温是多少度,这是一个回归任务; 预测明天是阴、晴还是雨,就是一个分类任务。 回归问题通常是用来预测一个值,如预测房价、未来的天气情况等等,例如一个产品的实际价格为500元,通过回归分析预测值为499元,我们认为这是一个比较好的回归分析。 一个比较常见的回归算法是线性回归算法(LR)。 回归是对真实值的一种逼近预测。 分类问题是用于将事物打上一个标签,通常结果为离散值。例如判断一幅图片上的动物是一只猫还是一只狗,分类通常是建立在回归之上。

linear model.LinearRegression 类

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

在这里插入图片描述
学习地址:https://blog.csdn.net/qq_45797116/article/details/112437862

!!如果要使用线性回归模型,那么必须假设数据的误差均值为零的正态分布。

x.shape

numpy 创建的数组都有一个shape属性,它是一个元组,返回各个维度的维数。有时候我们可能需要知道某一维的特定维数。
y是一个两行三列的二维数组,y.shape[0]代表行数,y.shape[1]代表列数。

reg小tips

reg.coef_ 查看回归系数
reg.intercept_ 查看截距

*zip(*iterables)函数详解

*zip()函数是zip()函数的逆过程,将zip对象变成原先组合前的数据。

## *zip()函数
print('=*'*10 + "*zip()函数" + '=*'*10)
m = [[1, 2, 3],  [4, 5, 6],  [7, 8, 9]]
n = [[2, 2, 2],  [3, 3, 3],  [4, 4, 4]]
print("*zip(m, n)返回:\n", *zip(m, n))
m2, n2 = zip(*zip(m, n))
# 若相等,返回True;说明*zip为zip的逆过程
print(m == list(m2) and n == list(n2))

plt.scatter用法

基本的使用方法如下:

[python] view plain copy

#导入必要的模块
import numpy as np
import matplotlib.pyplot as plt
#产生测试数据
x = np.arange(1,10)
y = x
fig = plt.figure()
ax1 = fig.add_subplot(111)
#设置标题
ax1.set_title(‘Scatter Plot’)
#设置X轴标签
plt.xlabel(‘X’)
#设置Y轴标签
plt.ylabel(‘Y’)
#画散点图
ax1.scatter(x,y,c = ‘r’,marker = ‘o’)
#设置图标
plt.show()
#显示所画的图

zip的用法

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

惰性计算

是指仅仅在真正需要执行的时候才计算的表达式的值。充分利用其特点 可以带来很多的便利

  1. 避免不必要的计算,带来性能的提升。

    对于Python中的条件表达式 if x and y,在x为false的情况下y表达式的值将不再计算。而对于if x or y,当x的值为true的时候将直接返回,不再计算y的值。因此编程中可以利用该特性,在 and逻辑中,将小概率发生的条件放在前面或者在or逻辑中,将大概率发生的时间放在前面,有助于性能的提升。

  2. 节省空间,使得无限循环的数据结构成为可能

    Python中最经典的使用延迟计算的例子就是生成式表达器了,它仅在每次需要计算的时候才通过yield产生所需要的元素。
    在这里插入图片描述

figure用法

figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
(2)例子:

import matplotlib.pyplot as plt
创建自定义图像
fig=plt.figure(figsize=(4,3),facecolor=‘blue’)
plt.show()

dot的用法

import numpy as np
np.dot(a, b, out=None) #该函数的作用是获取两个元素a,b的乘积.

# 简单的线性回归算法

import numpy as np
import matplotlib.pyplot as plt
 
x=np.array([1,2,3,4,5],dtype=np.float)
y=np.array([1,3.0,2,3,5])
plt.scatter(x,y)
 
x_mean=np.mean(x)
y_mean=np.mean(y)
num=0.0
d=0.0
for x_i,y_i in zip(x,y):
    num+=(x_i-x_mean)*(y_i-y_mean)
    d+=(x_i-x_mean)**2
    a=num/d
    b=y_mean-a*x_mean
y_hat=a*x+b
 
plt.figure(2)
plt.scatter(x,y)
plt.plot(x,y_hat,c='r')
x_predict=4.8
y_predict=a*x_predict+b
print(y_predict)
plt.scatter(x_predict,y_predict,c='b',marker='+')

在以上代码中实现最小二乘法的过程使用了for循环,其运算时间变长,因此我们可以使用矩阵相乘从而减小运算时间。

a=(x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)

最小二乘法:
在这里插入图片描述
均方误差MSE:
在这里插入图片描述
均方根误差:
在这里插入图片描述
平均绝对误差:
在这里插入图片描述

Rsquared: 最好的衡量线性回归法的指标
利用数据拟合一个模型,模型肯定是存在误差的,那么你的回归方程对观测值拟合的怎么样,就叫做拟合优度,你这里的R-square,就是度量拟合优度的一个统计量,即常说的r方,它叫做可决系数,它的计算方法为
在这里插入图片描述
看这个式子式用1减去y对回归方程的方差(未解释离差)与y的总方差的比值,y减去y尖也就是残差,是拟合方程中不能解释的部分,用1减去不能解释的部分,那么剩下的就是解释的部分,也就是说自变量解释了因变量变动的百分比的多少,那么r方的值肯定是越大越好,意味着该模型把y的变动解释得好,R方的范围显然是0到1,在预测实践中,人们往往采纳R方最高的模型。除此之外,拟合优度还有另一个测定指标是相关系数,相关系数的公式:

以上都是解析解,也就是直接根据公式来计算。

Gradient descent(梯度下降模型,逼近法)

解析解是用一种易于理解的形式描述问题,并计算精确解。 数值解是先猜测解,随后检验此解是否足以解决问题
在这里插入图片描述
简单地说,我们需要沿着梯度下降的方向找到一个收敛的参数值,Andrew ng给出的算法如下:
在这里插入图片描述

其中alpha是learning rate, 是用来控制下降每步的距离(太小收敛会很慢,太大则可能跳过最优点),Andrew ng提到了按照对数的方法来选择,例如0.1, 0.03, 0.01, 0.003, etc.其中的J函数是所谓的cost function(loss function),同样在数学、统计学中有大量的应用,是衡量我们的预测函数f(x)精度的函数,同样我们的目标是最小化J。
在这里插入图片描述
这个过程可以写程序来完成,具体可以做下Andrew ng的相应部分练习题,完成的过程还是很有意思的,也是不断加深对于梯度下降方法的理解。 有时间要做一下这个练习

那么两种方法(解析解和逼近法)如何选择,解析解好处是显而易见的,例如无需选择learning rate alpha,无需循环,坏处是要有复杂的矩阵运算(转置矩阵,逆矩阵等),复杂度比较高O(n3),相较而言,梯度下降则是O(d*n2)Andrew ng提到n<10000,大致可以用解析解,n>10000则可以用梯度下降。当然这不是必然的,我们需要理解为什么不选择解析解,主要是我们的计算机太慢(复杂度太高导致时间过长),随着计算机越来越快,这个经验值可以调整。

参考链接:https://zhuanlan.zhihu.com/p/25434586

快捷键注释!!! Ctrl+/

Pandas库学习

data.loc[index,column]
使用.loc[ ]第一个参数是行索引,第二个参数是列索引

import pandas as pd
data = pd.DataFrame([range(1,5),range(6,10),range(11,15)])
print(data)
dt = data.loc[0,1]  //[index,column]
print(dt)

在这里插入图片描述
还可以全部使用标签来作为行索引和列索引

import pandas as pd
data = pd.DataFrame([range(1,5),range(6,10),range(11,15)],['第一行','第二行','第三行'],['第一列','第二列','第三列','第四列'])
print(data)
dt = data.loc['第一行','第三列']
print(dt)

在这里插入图片描述

文件读写复习

常见的读写操作:

with open(r’filename.txt’) as f:
data_user=pd.read_csv(f) #文件的读操作

with open(‘data.txt’, ‘w’) as f:
f.write(‘hello world’) #文件的写操作

r: 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式
w: 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a: 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

#读取csv文件
 
#coding:utf-8
import csv
 
with open('qiye.csv','r') as f:
    f_csv = csv.reader(f)
    headers = next(f_csv)
    print (headers)
for row in f_csv:
    print (row)

学习地址:https://blog.csdn.net/weixin_39739342/article/details/93379653
https://blog.csdn.net/Enternalwiser/article/details/108257085

Python的reshape的用法:reshape(1,-1)

numpy中reshape函数的三种常见相关用法:

numpy.arange(n).reshape(a, b) 依次生成n个自然数,并且以a行b列的数组形式显示`np.arange(16).reshape(2,8) #生成16个自然数,以2行8列的形式显示

np.arange(16).reshape(2,8) #生成16个自然数,以28列的形式显示
# Out: 
# array([[ 0,  1,  2,  3,  4,  5,  6,  7],
#       [ 8,  9, 10, 11, 12, 13, 14, 15]])

mat (or array).reshape(c, -1) 必须是矩阵格式或者数组格式,才能使用 .reshape(c, -1) 函数, 表示将此矩阵或者数组重组,以 c行d列的形式表示

arr.shape    # (a,b)
arr.reshape(m,-1) #改变维度为m行、d列 (-1表示列数自动计算,d= a*b /m )
arr.reshape(-1,m) #改变维度为d行、m列 (-1表示行数自动计算,d= a*b /m )

-1的作用就在此: 自动计算d:d=数组或者矩阵里面所有的元素个数/c, d必须是整数,不然报错)-1在行/列的位置说明其位置不固定数值,需要根据固定的行/列计算。

reshape(1,-1)转化成1行:
在这里插入图片描述
reshape(2,-1)转换成两行:
在这里插入图片描述
reshape(-1,1)转换成1列:
在这里插入图片描述
参考地址:https://blog.csdn.net/qq_29831163/article/details/90112000

plt库

在matplotlib中,有两种画图方式:
plt.figure(): plt.***系列。通过http://plt.xxx来画图,其实是取了一个捷径。这是通过matplotlib提供的一个api,这个plt提供了很多基本的function可以让你很快的画出图来,但是如果你想要更细致的精调,就要使用另外一种方法。

在这里插入图片描述
Figure fig = plt.figure(): 可以解释为画布。
画图的第一件事,就是创建一个画布figure,然后在这个画布上加各种元素。

Axes ax = fig.add_subplot(1,1,1):
首先,这个不是你画图的xy坐标抽!
可以把axes理解为你要放到画布上的各个物体。比如你要画一个太阳,一个房子,一个车在画布上,那么太阳是一个axes,房子是一个axes,etc。

如果你的figure只有一张图,那么你只有一个axes。如果你的figure有subplot,那么每一个subplot就是一个axes

Axis ax.xaxis/ax.yaxis: xy坐标轴。
每个坐标轴实际上也是由竖线和数字组成的,每一个竖线其实也是一个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进行编辑就会修改xaxis图像上的表现。

在这里插入图片描述
这个function创建了一个大小为(14,7)的画布,把这个画布赋值给变量fig,同时在这个画布上创建了一个axes,把这个axes赋值给ax。这样,所有未来的http://fig.xxx都是对这个画布的操作,所有http://ax.xxx都是对这个axes的操作。

如果你有两个图,那么ax是一个有两个元素ax[0],ax[1] 的list。ax[0]就对应第一个subplot的ax。

fig, ax = plt.subplots(figsize=(14,7))
# fig, ax = plt.subplots(2,1,figsize(14,7))
# ax[0].***
# ax[1].***

plt和ax画图两者是可以互相转换的,然而转换过程让你的代码更复杂,有时还会产生难以理解的bug。因此画图的时候,请坚持使用一种格式。

绘图学习:

https://www.cnblogs.com/lfri/p/12248629.html

plt.figure是创建一个新的画布,plt.plot是绘制曲线。

简单线性回归算法

简单线性模型假设响应变量和解释变量之间存储线性关系,它使用一个被称为超平面的线性面来对这种关系进行建模。

这里的LinearRegression类是一个估计器。估计其基于观测到的数据预测一个值,sk-learn中所有的估计器都实现了fit和predict方法。前者用于学习模型的参数,后者用于学习到的参数来预测一个解释变量对应的响应变量值

用代价函数评价模型的拟合性

我们根据一些参数集合的值绘制出几条回归曲线,我们如何评估哪组参数值产生了最佳的拟合回归线呢?

多元线性回归算法学习地址:https://blog.csdn.net/qq_45797116/article/details/112437862

GridSearchCV

GridSearch和CV,即网格搜索和交叉验证。网格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,这其实是一个训练和比较的过程。k折交叉验证将所有数据集分成k份,不重复地每次取其中一份做测试集,用其余k-1份做训练集训练模型,之后计算该模型在测试集上的得分,将k次的得分取平均得到最后的得分。

GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得到结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值