开发者社区> shelgi> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

机器学习 --- 线性回归

简介: 机器学习 --- 线性回归
+关注继续查看

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>

今天我们来开始入门机器学习,简单介绍一下线性回归模型


image.png

image.png

这几天一直有人问我拟合数据的问题,还有预测模型等问题,所以就想来开始一下这个我一直在准备的专栏--机器学习


线性回归是线性模型,例如,假设输入变量(x)和单个输出变量(y)之间存在线性关系的模型。


更具体地,可以根据输入变量(x)的线性组合来计算输出变量(y)。

所以我们希望算法学习假设的参数,以便能够建立方程进行预测 该方程以特征和参数作为输入,并预测其值作为输出。


要弄明白线性回归就要从背后的数学原理开始讲起


1.数学原理


从初中我们就开始接触方程,一开始是简单的y=kx+b,到后来越来越复杂。初中时有没有碰到这样一类问题呢?题目给出了一大堆商场每天的销售数量和利润让你从中得到函数去估计未来某个销售数量的利润。又或者是大学做大物实验画图的时候,老师总会说描点画线的要求是画一条直线,使每个点均匀的分布在这条直线的两边,且到直线的距离最短。那什么样的直线才是最适合的来预测这些数据特征(属性的)曲线呢?这就需要讲讲线性模型了。


首先是最基本的表达形式?

image.png


其中X是自变量的各个属性,θ是参数?

image.png

?然后就是最重要的就是怎么才能使参数最优,也就是损失率降到最小。 这就需要谈谈损失率和损失函数了,在这里我们选择的损失函数是均方误差


image.png


有了损失函数那我们还要想办法使误差最小。怎么求一个函数的最小值呢,就需要另外一个很重要的算法,叫梯度下降。

梯度下降:梯度下降是一种用来寻找最小损失函数的迭代优化算法。查找局部最小损失函数使用梯度下降算法,以当前点函数的负梯度的一定比例的步数进行逼近。

下图表示我们从函数高点出发找到局部最小值的步骤。


image.png


函数的负梯度理解起来就是损失函数求导的负方向


image.png


然后每次更新的步长就是我们说的学习率,这样就可以通过迭代求出损失函数的最小值了,从而就得到了最优参数解。


这里有个问题,就是梯度下降容易陷入局部最小值而不是全局最小值,这就涉及到随机梯度下降等优化算法了,而且还有过拟合从而失去泛化能力


代码实现部分


首先是最基本的线性拟合方法

image.png


就拿帮别人做的个作业来举例子


import pandas as pd
import numpy as np
import math
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False 
#导入数据
#平方英尺
x=[150,200,250,300,350,400,600]
#房价
y=[6450,7450,8450,9450,11450,15450,18450]
#训练集和测试集
x_train=np.array(x[0:5])
y_train=np.array(y[0:5])
x_test=np.array(x[5:7])
y_test=np.array(y[5:7])
def fun(p,x):
    k,b=p
    return k*x+b
# 误差函数
def error(p,x,y):
    return np.sqrt((fun(p,x)-y)**2)
#只用前五个数据进行预测
p0=[100,2]
para=leastsq(error,p0,args=(x_train,y_train))
k,b=para[0]
print("拟合的方程为:y={}x+{}".format(k,b))
#绘制拟合直线
plt.figure(figsize=(8,6))
plt.scatter(x,y,color="red",label="Point",linewidth=3)
X=np.linspace(100,700,1000)
Y=k*X+b
plt.plot(X,Y,color="orange",label="拟合直线",linewidth=2)
plt.xlabel('平方英尺')
plt.ylabel('房价')
plt.legend()
plt.show()
复制代码


image.png


#画误差图
err1=[]
for i in range(len(x_train)):
    err1.append(k*x_train[i]+b-y_train[i])

plt.figure(figsize=(10, 7))
plt.title('误差图')
plt.plot(x_train,err1,'r',label='error', linewidth=3)
plt.xlabel('x')
plt.ylabel('error')
plt.show()

image.png


然后自己仿着sklearn的线性模型写段代码,构建属于自己的线性模型训练器这里用到的数据集是2017年世界幸福指数和GPD的数据,可以在kaggle上下载,链接如下www.kaggle.com/unsdsn/worl…然后我们通过GDP指数去预测人们的幸福指数


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#导入数据
data = pd.read_csv('2017.csv')
#查看数据集
data.info()
data.head(10)
复制代码


image.png


image.png

#画出每一个属性的分布直方图
histohrams = data.hist(grid=False, figsize=(10, 10))

image.png

#切分训练集和测试集
#分出80%训练集,20%测试集
#这里没有用到sklearn的train_test_split
train_data = data.sample(frac=0.8)
test_data = data.drop(train_data.index)

x_train = train_data[['Economy..GDP.per.Capita.']].values
y_train = train_data[['Happiness.Score']].values


x_test = test_data[['Economy..GDP.per.Capita.']].values
y_test = test_data[['Happiness.Score']].values

#绘制出散点图
plt.scatter(x_train, y_train, label='Training Dataset')
plt.scatter(x_test, y_test, label='Test Dataset')
plt.xlabel('Economy..GDP.per.Capita.')
plt.ylabel('Happiness.Score')
plt.title('Countries Happines')
plt.legend()
plt.show()

image.png

然后就是一些正则化防止过拟合的函数和归一化的函数了,这里就不贴了


#开始自己动手写一个线性回归模型
class self_LinearRegression:
    def __init__(self, data, labels, polynomial_degree=0, sinusoid_degree=0, normalize_data=True):
        (data_processed,features_mean,features_deviation)=prepare_for_training(data, polynomial_degree, sinusoid_degree, normalize_data)
        self.data = data_processed
        self.labels = labels
        self.features_mean = features_mean
        self.features_deviation = features_deviation
        self.polynomial_degree = polynomial_degree
        self.sinusoid_degree = sinusoid_degree
        self.normalize_data = normalize_data
        num_features = self.data.shape[1]
        self.theta = np.zeros((num_features, 1))
    #训练
    def train(self, alpha, lambda_param=0, num_iterations=500):
        cost_history = self.gradient_descent(alpha, lambda_param, num_iterations)
        return self.theta, cost_history
    #梯度下降
    def gradient_descent(self, alpha, lambda_param, num_iterations):
        cost_history = []
        for _ in range(num_iterations):
            self.gradient_step(alpha, lambda_param)
            cost_history.append(self.cost_function(self.data, self.labels, lambda_param))
        return cost_history
    def gradient_step(self, alpha, lambda_param):
        num_examples = self.data.shape[0]
        predictions = self_LinearRegression.hypothesis(self.data, self.theta)
        delta = predictions - self.labels
        reg_param = 1 - alpha * lambda_param / num_examples
        theta = self.theta
        theta = theta * reg_param - alpha * (1 / num_examples) * (delta.T @ self.data).T
        theta[0] = theta[0] - alpha * (1 / num_examples) * (self.data[:, 0].T @ delta).T
        self.theta = theta
    #损失率
    def get_cost(self, data, labels, lambda_param):
        data_processed = prepare_for_training(
            data,
            self.polynomial_degree,
            self.sinusoid_degree,
            self.normalize_data,
        )[0]
        return self.cost_function(data_processed, labels, lambda_param)
    def cost_function(self, data, labels, lambda_param):
        num_examples = data.shape[0]
        delta = self_LinearRegression.hypothesis(data, self.theta) - labels
        theta_cut = self.theta[1:, 0]
        reg_param = lambda_param * (theta_cut.T @ theta_cut)
        cost = (1 / 2 * num_examples) * (delta.T @ delta + reg_param)
        return cost[0][0]
    #预测
    def predict(self, data):
        data_processed = prepare_for_training(
            data,
            self.polynomial_degree,
            self.sinusoid_degree,
            self.normalize_data,
        )[0]
        predictions = self_LinearRegression.hypothesis(data_processed, self.theta)
        return predictions
    @staticmethod
    def hypothesis(data, theta):
        predictions = data @ theta
        return predictions
复制代码
#现在开始训练自己做的线性回归模型
num_iterations = 500  #设置迭代次数
learning_rate = 0.01   #学习率
regularization_param = 0 #正则化参数
polynomial_degree = 0
sinusoid_degree = 0 
linear_regression = self_LinearRegression(x_train, y_train, polynomial_degree, sinusoid_degree)
(theta, cost_history) = linear_regression.train(learning_rate,regularization_param,num_iterations)
#输出训练的损失率
print('最初损失率: {:.2f}'.format(cost_history[0]))
print('最优损失率: {:.2f}'.format(cost_history[-1]))
#输出模型参数
theta_table = pd.DataFrame({'自己的线性模型参数': theta.flatten()})
theta_table.head()


image.png

用自己写的模型训练得到的线性回归方程为:y=5.383319*x+0.892002


#画出梯度下降
plt.plot(range(num_iterations), cost_history)
plt.xlabel('迭代次数')
plt.ylabel('损失率')
plt.title('损失率梯度下降图')
plt.show()


image.png

#用自己构建的模型去进行预测,绘制出模型预测直线

predictions_num = 100
x_predictions = np.linspace(x_train.min(), x_train.max(), predictions_num).reshape(predictions_num, 1)
y_predictions = linear_regression.predict(x_predictions)

plt.scatter(x_train, y_train, label='训练数据')
plt.scatter(x_test, y_test, label='测试数据')
plt.plot(x_predictions, y_predictions, 'r', label='预测直线')
plt.xlabel('Economy..GDP.per.Capita.')
plt.ylabel('Happiness.Score')
plt.title('Countries Happines')
plt.legend()
plt.show()


image.png


后用sklrean的LinearRegression也来训练预测一下


#用sklearn构建线性回归模型
from sklearn.linear_model import LinearRegression
#创建模型
liner = LinearRegression()
#拟合模型
liner.fit(x_train,y_train)
#预测
y_predictions = liner.predict(x_predictions)
plt.scatter(x_train, y_train, label='训练数据')
plt.scatter(x_test, y_test, label='测试数据')
plt.plot(x_predictions, y_predictions, 'r', label='预测直线')
plt.xlabel('Economy..GDP.per.Capita.')
plt.ylabel('Happiness.Score')
plt.title('Countries Happines')
plt.legend()
plt.show()
print("斜率为:",liner.coef_)
print("截距为:",liner.intercept_)
复制代码



image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
机器学习
机器学习
28 0
线性回归|机器学习推导系列(三)
线性回归|机器学习推导系列(三)
27 0
【机器学习笔记】:大话线性回归(二)
其实还有很多问题需要我们解决:这个模型的效果如何?如何评判这个效果?开始线性模型的假设成立吗?如何验证这些假设?还会有其它问题会影响模型效果吗?
66 0
机器学习—机器学习
1.机器学习简介
80 0
线性回归机器学习算法介绍
在解释什么是线性回归之前,我们先举个例子! 假设我们已知m个样本,样本里有n个特征x,和对应的输出y。表达式如下: 现在出现了一个新的数据集 需要预测它对应的输出y是多少。 首先我们需要知道的是,如果输出y是连续的,则是回归问题,否则是分类问题。
2976 0
机器学习(二)
机器学习(二) 本文只提供机器学习整体框架 类, 方法与函数的使用请自行查看官方API 机器学习的步骤 数据采样(过采样与下采样) 下采样: 目前不知道有第三方库实现, 自己实现的思路: 通过随机函数生成下标列表, 将下标连接在一起生成新的样本集合 过采样(更常用一些, 因为过采样的数据量...
640 0
机器学习实战之线性回归
之前我们学习的机器学习算法都是属于分类算法,也就是预测值是离散值。当预测值为连续值时,就需要使用回归算法。本文将介绍线性回归的原理和代码实现。
813 0
机器学习
机器学习: 简单的说就是机器拥有了学习能力。这又是怎么一回事呢? 再回到人工智能的例子,只不过有所变动,我们知道,现在房价的波动有一定的规律,并感觉与年份、房间数有关,并认定规则为:房价=年份*a+房间数*b。
914 0
机器学习笔记(1):线性回归
初次接触机器学习的朋友们,建议先把这篇概念性的科普文章,精读5遍以上:神经网络浅讲:从神经元到深度学习 下列代码来自 https://zh.gluon.ai/chapter_supervised-learning/linear-regression-scratch.
1299 0
机器学习之——单变量线性回归
线性回归 线性回归(Linear Regression)作为Machine Learning?整个课程的切入例子确实有独到的地方,以简单的例子为出发点,将学习任务的主干串起来。问题的建模可以简单如下图所示: 线性回归可以分为单变量线性回归(Linear Regression with One Variable)以及多变量线性回归(Linear Regression with Mul
1565 0
+关注
79
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载
http://www.vxiaotou.com