import pandas as pd
<pre name="code" class="python"># read csv file directly from a URL and save the results
data = pd.read_csv('/home/lulei/Advertising.csv')
# display the first 5 rows
data.head()
- 这里的Advertising.csv是来自Advertising.csv。大家可以自己下载。
- TV Radio Newspaper Sales
- 0 230.1 37.8 69.2 22.1
- 1 44.5 39.3 45.1 10.4
- 2 17.2 45.9 69.3 9.3
- 3 151.5 41.3 58.5 18.5
- 4 180.8 10.8 58.4 12.9
Series类似于一维数组,它有一组数据以及一组与之相关的数据标签(即索引)组成。
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典。
# display the last 5 rows
data.tail()
- 只显示结果的末尾5行
- TV Radio Newspaper Sales
- 195 38.2 3.7 13.8 7.6
- 196 94.2 4.9 8.1 9.7
- 197 177.0 9.3 6.4 12.8
- 198 283.6 42.0 66.2 25.5
- 199 232.1 8.6 8.7 13.4
# check the shape of the DataFrame(rows, colums)
data.shape
- 查看DataFrame的形状,注意第一列的叫索引,和数据库某个表中的第一列类似。
TV:对于一个给定市场中单一产品,用于电视上的广告费用(以千为单位)
Radio:在广播媒体上投资的广告费用
Newspaper:用于报纸媒体的广告费用
Sales:对应产品的销量
import seaborn as sns
import matplotlib.pyplot as plt
# visualize the relationship between the features and the response using scatterplots
sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.8)
plt.show()#注意必须加上这一句,否则无法显示。
这里选择TV、Radio、Newspaper 作为特征,Sales作为观测值
返回的结果:
- seaborn的pairplot函数绘制X的每一维度和对应Y的散点图。通过设置size和aspect参数来调节显示的大小和比例。可以从图中看出,TV特征和销量是有比较强的线性关系的,而Radio和Sales线性关系弱一些,Newspaper和Sales线性关系更弱。通过加入一个参数kind='reg',seaborn可以添加一条最佳拟合直线和95%的置信带。
sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.8, kind='reg')
plt.show()
- 结果显示如下:
y是响应
β0是截距
β1是x1的系数,以此类推
- (1)、使用pandas来构建X(特征向量)和y(标签列)
#create a python list of feature names
feature_cols = ['TV', 'Radio', 'Newspaper']
# use the list to select a subset of the original DataFrame
X = data[feature_cols]
# equivalent command to do this in one line
X = data[['TV', 'Radio', 'Newspaper']]
# print the first 5 rows
print X.head()
# check the type and shape of X
print type(X)
print X.shape
- 输出结果如下:
- TV Radio Newspaper
- 0 230.1 37.8 69.2
- 1 44.5 39.3 45.1
- 2 17.2 45.9 69.3
- 3 151.5 41.3 58.5
- 4 180.8 10.8 58.4
- <class 'pandas.core.frame.DataFrame'>
- (200, 3)
# select a Series from the DataFrame
y = data['Sales']
# equivalent command that works if there are no spaces in the column name
y = data.Sales
# print the first 5 values
print y.head()
- 输出的结果如下:
- 0 22.1
- 1 10.4
- 2 9.3
- 3 18.5
- 4 12.9
- Name: Sales
<pre name="code" class="python"><span style="font-size:14px;">##构造训练集和测试集
from sklearn.cross_validation import train_test_split #这里是引用了交叉验证
X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1)
- #default split is 75% for training and 25% for testing
print X_train.shape
print y_train.shape
print X_test.shape
print y_test.shape
- 输出结果如下:
- (150, 3)
- (150,)
- (50, 3)
- (50,)
- ImportError Traceback (most recent call last)<ipython-input-182-3eee51fcba5a> in <module>() 1 ###构造训练集和测试集----> 2 from sklearn.cross_validation import train_test_split 3 #import sklearn.cross_validation 4 X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1) 5 # default split is 75% for training and 25% for testingImportError: cannot import name train_test_split
- (3)sklearn的线性回归
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
model=linreg.fit(X_train, y_train)
print model
print linreg.intercept_
print linreg.coef_
- 输出的结果如下:
- LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
- 2.66816623043
- [ 0.04641001 0.19272538 -0.00349015]
# pair the feature names with the coefficients
zip(feature_cols, linreg.coef_)
- 输出如下:
- [('TV', 0.046410010869663267),
- ('Radio', 0.19272538367491721),
- ('Newspaper', -0.0034901506098328305)]
- y=2.668+0.0464∗TV+0.192∗Radio-0.00349∗Newspaper
- 如何解释各个特征对应的系数的意义?
y_pred = linreg.predict(X_test)
print y_pred
print type(y_pred)
- 输出结果如下:
- [ 14.58678373 7.92397999 16.9497993 19.35791038 7.36360284
- 7.35359269 16.08342325 9.16533046 20.35507374 12.63160058
- 22.83356472 9.66291461 4.18055603 13.70368584 11.4533557
- 4.16940565 10.31271413 23.06786868 17.80464565 14.53070132
- 15.19656684 14.22969609 7.54691167 13.47210324 15.00625898
- 19.28532444 20.7319878 19.70408833 18.21640853 8.50112687
- 9.8493781 9.51425763 9.73270043 18.13782015 15.41731544
- 5.07416787 12.20575251 14.05507493 10.6699926 7.16006245
- 11.80728836 24.79748121 10.40809168 24.05228404 18.44737314
- 20.80572631 9.45424805 17.00481708 5.78634105 5.10594849]
- <type 'numpy.ndarray'>
<pre name="code" class="python">#计算Sales预测的RMSE
print type(y_pred),type(y_test)
print len(y_pred),len(y_test)
print y_pred.shape,y_test.shape
from sklearn import metrics
import numpy as np
sum_mean=0
for i in range(len(y_pred)):
sum_mean+=(y_pred[i]-y_test.values[i])**2
sum_erro=np.sqrt(sum_mean/50)
# calculate RMSE by hand
print "RMSE by hand:",sum_erro
- 最后的结果如下:
- <type 'numpy.ndarray'> <class 'pandas.core.series.Series'>
- 50 50
- (50,) (50,)
- RMSE by hand: 1.42998147691
- (2)做ROC曲线
import matplotlib.pyplot as plt
plt.figure()
plt.plot(range(len(y_pred)),y_pred,'b',label="predict")
plt.plot(range(len(y_pred)),y_test,'r',label="test")
plt.legend(loc="upper right") #显示图中的标签
plt.xlabel("the number of sales")
plt.ylabel('value of sales')
plt.show()
- 显示结果如下:(红色的线是真实的值曲线,蓝色的是预测值曲线)
#create a python list of feature names
feature_cols = ['TV', 'Radio', 'Newspaper']
# use the list to select a subset of the original DataFrame
X = data[feature_cols]
# equivalent command to do this in one line
#X = data[['TV', 'Radio', 'Newspaper']]#只需修改这里即可<pre name="code" class="python" style="font-size: 15px; line-height: 35px;">X = data[['TV', 'Radio']] #去掉newspaper其他的代码不变
- # print the first 5 rowsprint X.head()# check the type and shape of Xprint type(X)print X.shape
- 2.81843904823
- [ 0.04588771 0.18721008]
- RMSE by hand: 1.28208957507
- 然后再次使用ROC曲线来观测曲线的整体情况。我们在将Newspaper这个特征移除之后,得到RMSE变小了,说明Newspaper特征可能不适合作为预测销量的特征,于是,我们得到了新的模型。我们还可以通过不同的特征组合得到新的模型,看看最终的误差是如何的。
- 之前我提到了这种错误:
- ImportError Traceback (most recent call last)<ipython-input-182-3eee51fcba5a> in <module>() 1 ###构造训练集和测试集----> 2 from sklearn.cross_validation import train_test_split 3 #import sklearn.cross_validation 4 X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1) 5 # default split is 75% for training and 25% for testingImportError: cannot import name train_test_split
- 这里我给出我自己写的函数:
import random
<span style="font-family:microsoft yahei;">######自己写一个随机分配数的函数,分成两份,并将数值一次存储在对应的list中##########
def train_test_split(ylabel, random_state=1):
import random
index=random.sample(range(len(ylabel)),50*random_state)
list_train=[]
list_test=[]
i=0
for s in range(len(ylabel)):
if i in index:
list_test.append(i)
else:
list_train.append(i)
i+=1
return list_train,list_test
###############对特征进行分割#############################
feature_cols = ['TV', 'Radio','Newspaper']
X1 = data[feature_cols]
线性回归模型计算(线性回归模型计算器)
大家好!今天让创意岭的小编来大家介绍下关于线性回归模型计算的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等
只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端
创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008
本文目录:
一、python多元线性回归怎么计算
1、什么是多元线性回归模型?
当y值的影响因素不唯一时,采用多元线性回归模型。
y =y=β0+β1x1+β2x2+...+βnxn
例如商品的销售额可能不电视广告投入,收音机广告投入,报纸广告投入有关系,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.
2、使用pandas来读取数据
pandas 是一个用于数据探索、数据分析和数据处理的python库
[python] view plain copy
[html] view plain copy
上面代码的运行结果:
上面显示的结果类似一个电子表格,这个结构称为Pandas的数据帧(data frame),类型全称:pandas.core.frame.DataFrame.
pandas的两个主要数据结构:Series和DataFrame:
[python] view plain copy
[html] view plain copy
(200,4)
3、分析数据
特征:
响应:
在这个案例中,我们通过不同的广告投入,预测产品销量。因为响应变量是一个连续的值,所以这个问题是一个回归问题。数据集一共有200个观测值,每一组观测对应一个市场的情况。
注意:这里推荐使用的是seaborn包。网上说这个包的数据可视化效果比较好看。其实seaborn也应该属于matplotlib的内部包。只是需要再次的单独安装。
[python] view plain copy
[html] view plain copy
[html] view plain copy
[python] view plain copy
4、线性回归模型
优点:快速;没有调节参数;可轻易解释;可理解。
缺点:相比其他复杂一些的模型,其预测准确率不是太高,因为它假设特征和响应之间存在确定的线性关系,这种假设对于非线性的关系,线性回归模型显然不能很好的对这种数据建模。
线性模型表达式: y=β0+β1x1+β2x2+...+βnxn 其中
在这个案例中: y=β0+β1∗TV+β2∗Radio+...+βn∗Newspaper
scikit-learn要求X是一个特征矩阵,y是一个NumPy向量。
pandas构建在NumPy之上。
因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解这种结构。
[python] view plain copy
[python] view plain copy
(2)、构建训练集与测试集
[html] view plain copy
[html] view plain copy
注:上面的结果是由train_test_spilit()得到的,但是我不知道为什么我的版本的sklearn包中居然报错:
处理方法:1、我后来重新安装sklearn包。再一次调用时就没有错误了。
2、自己写函数来认为的随机构造训练集和测试集。(这个代码我会在最后附上。)
[html] view plain copy
[html] view plain copy
对于给定了Radio和Newspaper的广告投入,如果在TV广告上每多投入1个单位,对应销量将增加0.0466个单位。就是加入其它两个媒体投入固定,在TV广告上每增加1000美元(因为单位是1000美元),销量将增加46.6(因为单位是1000)。但是大家注意这里的newspaper的系数居然是负数,所以我们可以考虑不使用newspaper这个特征。这是后话,后面会提到的。
(4)、预测
[python] view plain copy
[python] view plain copy
5、回归问题的评价测度
(1) 评价测度
对于分类问题,评价测度是准确率,但这种方法不适用于回归问题。我们使用针对连续数值的评价测度(evaluation metrics)。
这里介绍3种常用的针对线性回归的测度。
1)平均绝对误差(Mean Absolute Error, MAE)
(2)均方误差(Mean Squared Error, MSE)
(3)均方根误差(Root Mean Squared Error, RMSE)
这里我使用RMES。
[python] view plain copy
[python] view plain copy
直到这里整个的一次多元线性回归的预测就结束了。
6、改进特征的选择
在之前展示的数据中,我们看到Newspaper和销量之间的线性关系竟是负关系(不用惊讶,这是随机特征抽样的结果。换一批抽样的数据就可能为正了),现在我们移除这个特征,看看线性回归预测的结果的RMSE如何?
依然使用我上面的代码,但只需修改下面代码中的一句即可:
[python] view plain copy
最后的到的系数与测度如下:
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
备注:
注:上面的结果是由train_test_spilit()得到的,但是我不知道为什么我的版本的sklearn包中居然报错:
处理方法:1、我后来重新安装sklearn包。再一次调用时就没有错误了。
2、自己写函数来认为的随机构造训练集和测试集。(这个代码我会在最后附上。)
[python] view plain copy
[python] view plain copy
二、线性回归方程公式b怎么求
第一:用所给样本求出两个相关变量的(算术)平均值:
x_=(x1+x2+x3+...+xn)/n
y_=(y1+y2+y3+...+yn)/n
第二:分别计算分子和分母:(两个公式任选其一)
分子=(x1y1+x2y2+x3y3+...+xnyn)-nx_Y_
分母=(x1^2+x2^2+x3^2+...+xn^2)-n*x_^2
第三:计算 b : b=分子 / 分母
用最小二乘法估计参数b,设服从正态分布,分别求对a、b的偏导数并令它们等于零,得方程组解为
其中 ,且为观测值的样本方差.线性方程称为关于的线性回归方程,称为回归系数,对应的直线称为回归直线.顺便指出,将来还需用到,其中为观测值的样本方差.
先求x,y的平均值X,Y
再用公式代入求解:b=(x1y1+x2y2+...xnyn-nXY)/(x1+x2+...xn-nX)
后把x,y的平均数X,Y代入a=Y-bX
求出a并代入总的公式y=bx+a得到线性回归方程
(X为xi的平均数,Y为yi的平均数)
扩展资料
分析按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。如果在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。
如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
参考资料:线性回归方程的百度百科
三、线性回归问题怎么求回归系数
y=bx+a
例如:
y=3x+1
因为不知道x前面的系数,和常数项所以设成a,b,a和b通常是需要求的。
先求x,y的平均值X,Y
再用公式代入求解:b=(x1y1+x2y2+...xnyn-nXY)/(x1+x2+...xn-nX)
后把x,y的平均数X,Y代入a=Y-bX
求出a并代入总的公式y=bx+a得到线性回归方程。
扩展资料:
在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。这些模型被叫做线性模型。最常用的线性回归建模是给定X值的y的条件均值是X的仿射函数。
不太一般的情况,线性回归模型可以是一个中位数或一些其他的给定X的条件下y的条件分布的分位数作为X的线性函数表示。像所有形式的回归分析一样,线性回归也把焦点放在给定X值的y的条件概率分布,而不是X和y的联合概率分布。
四、最小二乘法求线性回归方程中的系数a,b怎么求
用最小二乘法求回归直线方程中的a,b有下面的公式:
最小二乘法:总离差不能用n个离差之和来表示,通常是用离差的平方和,即作为总离差,并使之达到最小,这样回归直线就是所有直线中Q取最小值的那一条,这种使“离差平方和最小”的方法,叫做最小二乘法:
由于绝对值使得计算不变,在实际应用中人们更喜欢用:Q=(y1-bx1-a)²+(y2-bx-a²)+。。。+(yn-bxn-a)²
这样,问题就归结于:当a,b取什么值时Q最小,即到点直线y=bx+a的“整体距离”最小。
扩展资料:
回归分析的最初目的是估计模型的参数以便达到对数据的最佳拟合。在决定一个最佳拟合的不同标准之中,最小二乘法是非常优越的。这种估计可以表示为:
1)样本是在母体之中随机抽取出来的。
2)因变量Y在实直线上是连续的,
3)残差项是独立同分布的,也就是说,残差是独立随机的,且服从高斯分布。
这些假设意味着残差项不依赖自变量的值,所以 和自变量X(预测变量)之间是相互独立的。在这些假设下,建立一个显示线性回归作为条件预期模型的简单线性回归方程,可以表示为:
给一个随机样本 ,一个线性回归模型假设回归子 和回归量 之间的关系是除了X的影响以外,还有其他的变数存在。我们加入一个误差项 (也是一个随机变量)来捕获除了 之外任何对 的影响。
参考资料:百度百科——线性回归方程
以上就是关于线性回归模型计算相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读:
数字媒体非线性编辑技术知识点(数字媒体非线性编辑技术知识点汇总)