Ⅰ 如何用Python进行线性回归以及误差分析
数据挖掘中的预测问题通常分为2类:回归与分类。
简单的说回归就是预测数值,而分类是给数据打上标签归类。
本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析。
本例中使用一个2次函数加上随机的扰动来生成500个点,然后尝试用1、2、100次方的多项式对该数据进行拟合。
拟合的目的是使得根据训练数据能够拟合出一个多项式函数,这个函数能够很好的拟合现有数据,并且能对未知的数据进行预测。
代码如下:
importmatplotlib.pyplot as plt
importnumpy as np
importscipy as sp
fromscipy.statsimportnorm
fromsklearn.pipelineimportPipeline
fromsklearn.linear_modelimportLinearRegression
fromsklearn.
fromsklearnimportlinear_model
''''' 数据生成 '''
x = np.arange(0,1,0.002)
y = norm.rvs(0, size=500, scale=0.1)
y = y + x**2
''''' 均方误差根 '''
defrmse(y_test, y):
returnsp.sqrt(sp.mean((y_test - y) **2))
''''' 与均值相比的优秀程度,介于[0~1]。0表示不如均值。1表示完美预测.这个版本的实现是参考scikit-learn官网文档 '''
defR2(y_test, y_true):
return1- ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum()
''''' 这是Conway&White《机器学习使用案例解析》里的版本 '''
defR22(y_test, y_true):
y_mean = np.array(y_true)
y_mean[:] = y_mean.mean()
return1- rmse(y_test, y_true) / rmse(y_mean, y_true)
plt.scatter(x, y, s=5)
degree = [1,2,100]
y_test = []
y_test = np.array(y_test)
fordindegree:
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
('linear', LinearRegression(fit_intercept=False))])
clf.fit(x[:, np.newaxis], y)
y_test = clf.predict(x[:, np.newaxis])
print(clf.named_steps['linear'].coef_)
print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f'%
(rmse(y_test, y),
R2(y_test, y),
R22(y_test, y),
clf.score(x[:, np.newaxis], y)))
plt.plot(x, y_test, linewidth=2)
plt.grid()
plt.legend(['1','2','100'], loc='upper left')
plt.show()
该程序运行的显示结果如下:
[ 0. 0.75873781]
rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78
[ 0. 0.35936882 0.52392172]
rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87
[ 0.00000000e+00 2.63903249e-01 3.14973328e-01 2.43389461e-01
1.67075328e-01 1.10674280e-01 7.30672237e-02 4.88605804e-02
......
3.70018540e-11 2.93631291e-11 2.32992690e-11 1.84860002e-11
1.46657377e-11]
rmse=0.10, R2=0.90, R22=0.68, clf.score=0.90
Ⅱ 请教怎样用Python做stepwise回归
所说所有的变量都是对象。 对象在python里,其实是一个指针,指向一个数据结构,数据结构里有属性,有方法。
对象通常就是指变量。从面向对象OO的概念来讲,对象是类的一个实例。在python里很简单,对象就是变量。
class A:
myname="class a"
上面就是一个类。不是对象
a=A()
这里变量a就是一个对象。
它有一个属性(类属性),myname,你可以显示出来
print a.myname
所以,你看到一个变量后面跟点一个小数点。那么小数点后面。
Ⅲ 如何用Python进行线性回归以及误差分析
线性回归:
设x,y分别为一组数据,代码如下
import matplotlib.pyplot as plt
import numpy as np
ro=np.polyfit(x,y,deg=1) #deg为拟合的多项式的次数(线性回归就选1)
ry=np.polyval(ro,x) #忘记x和ro哪个在前哪个在后了。。。
print ro #输出的第一个数是斜率k,第二个数是纵截距b
plt.scatter(x,y)
plt.plot(x,ry)
Ⅳ python多元线性回归怎么计算
1、什么是多元线性回归模型?
当y值的影响因素不唯一时,采用多元线性回归模型。
y =y=β0+β1x1+β2x2+...+βnxn
例如商品的销售额可能不电视广告投入,收音机广告投入,报纸广告投入有关系,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.
2、使用pandas来读取数据
pandas 是一个用于数据探索、数据分析和数据处理的python库
[python]view plain
importpandasaspd
[html]view plain
<prename="code"class="python">#
data=pd.read_csv('/home/lulei/Advertising.csv')
#displaythefirst5rows
data.head()
上面代码的运行结果:
上面显示的结果类似一个电子表格,这个结构称为Pandas的数据帧(data frame),类型全称:pandas.core.frame.DataFrame.
pandas的两个主要数据结构:Series和DataFrame:
Series类似于一维数组,它有一组数据以及一组与之相关的数据标签(即索引)组成。
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典。
[python]view plain
#displaythelast5rows
data.tail()
只显示结果的末尾5行
[html]view plain
#checktheshapeoftheDataFrame(rows,colums)
data.shape
查看DataFrame的形状,注意第一列的叫索引,和数据库某个表中的第一列类似。
(200,4)
3、分析数据
特征:
TV:对于一个给定市场中单一产品,用于电视上的广告费用(以千为单位)
Radio:在广播媒体上投资的广告费用
Newspaper:用于报纸媒体的广告费用
响应:
Sales:对应产品的销量
在这个案例中,我们通过不同的广告投入,预测产品销量。因为响应变量是一个连续的值,所以这个问题是一个回归问题。数据集一共有200个观测值,每一组观测对应一个市场的情况。
注意:这里推荐使用的是seaborn包。网上说这个包的数据可视化效果比较好看。其实seaborn也应该属于matplotlib的内部包。只是需要再次的单独安装。
[python]view plain
importseabornassns
importmatplotlib.pyplotasplt
#ots
sns.pairplot(data,x_vars=['TV','Radio','Newspaper'],y_vars='Sales',size=7,aspect=0.8)
plt.show()#注意必须加上这一句,否则无法显示。
[html]view plain
这里选择TV、Radio、Newspaper作为特征,Sales作为观测值
[html]view plain
返回的结果:
[python]view plain
sns.pairplot(data,x_vars=['TV','Radio','Newspaper'],y_vars='Sales',size=7,aspect=0.8,kind='reg')
plt.show()
结果显示如下:
4、线性回归模型
优点:快速;没有调节参数;可轻易解释;可理解。
缺点:相比其他复杂一些的模型,其预测准确率不是太高,因为它假设特征和响应之间存在确定的线性关系,这种假设对于非线性的关系,线性回归模型显然不能很好的对这种数据建模。
线性模型表达式:y=β0+β1x1+β2x2+...+βnxn其中
y是响应
β0是截距
β1是x1的系数,以此类推
在这个案例中:y=β0+β1∗TV+β2∗Radio+...+βn∗Newspaper
(1)、使用pandas来构建X(特征向量)和y(标签列)
scikit-learn要求X是一个特征矩阵,y是一个NumPy向量。
pandas构建在NumPy之上。
因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解这种结构。
[python]view plain
#
feature_cols=['TV','Radio','Newspaper']
#
X=data[feature_cols]
#
X=data[['TV','Radio','Newspaper']]
#printthefirst5rows
printX.head()
#checkthetypeandshapeofX
printtype(X)
printX.shape
输出结果如下:
[python]view plain
#selectaSeriesfromtheDataFrame
y=data['Sales']
#
y=data.Sales
#printthefirst5values
printy.head()
输出的结果如下:
(2)、构建训练集与测试集
[html]view plain
<prename="code"class="python"><spanstyle="font-size:14px;">##构造训练集和测试集
fromsklearn.cross_validationimporttrain_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
[html]view plain
printX_train.shape
printy_train.shape
printX_test.shape
printy_test.shape
输出结果如下:
注:上面的结果是由train_test_spilit()得到的,但是我不知道为什么我的版本的sklearn包中居然报错:
处理方法:1、我后来重新安装sklearn包。再一次调用时就没有错误了。
2、自己写函数来认为的随机构造训练集和测试集。(这个代码我会在最后附上。)
(3)sklearn的线性回归
[html]view plain
fromsklearn.linear_modelimportLinearRegression
linreg=LinearRegression()
model=linreg.fit(X_train,y_train)
printmodel
printlinreg.intercept_
printlinreg.coef_
输出的结果如下:
[html]view plain
#
zip(feature_cols,linreg.coef_)
输出如下:
y=2.668+0.0464∗TV+0.192∗Radio-0.00349∗Newspaper
如何解释各个特征对应的系数的意义?
对于给定了Radio和Newspaper的广告投入,如果在TV广告上每多投入1个单位,对应销量将增加0.0466个单位。就是加入其它两个媒体投入固定,在TV广告上每增加1000美元(因为单位是1000美元),销量将增加46.6(因为单位是1000)。但是大家注意这里的newspaper的系数居然是负数,所以我们可以考虑不使用newspaper这个特征。这是后话,后面会提到的。
(4)、预测
[python]view plain
y_pred=linreg.predict(X_test)
printy_pred
[python]view plain
printtype(y_pred)
输出结果如下:
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
<prename="code"class="python">#计算Sales预测的RMSE
printtype(y_pred),type(y_test)
printlen(y_pred),len(y_test)
printy_pred.shape,y_test.shape
fromsklearnimportmetrics
importnumpyasnp
sum_mean=0
foriinrange(len(y_pred)):
sum_mean+=(y_pred[i]-y_test.values[i])**2
sum_erro=np.sqrt(sum_mean/50)
#calculateRMSEbyhand
print"RMSEbyhand:",sum_erro
最后的结果如下:
(2)做ROC曲线
[python]view plain
importmatplotlib.pyplotasplt
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="upperright")#显示图中的标签
plt.xlabel("thenumberofsales")
plt.ylabel('valueofsales')
plt.show()
显示结果如下:(红色的线是真实的值曲线,蓝色的是预测值曲线)
直到这里整个的一次多元线性回归的预测就结束了。
6、改进特征的选择
在之前展示的数据中,我们看到Newspaper和销量之间的线性关系竟是负关系(不用惊讶,这是随机特征抽样的结果。换一批抽样的数据就可能为正了),现在我们移除这个特征,看看线性回归预测的结果的RMSE如何?
依然使用我上面的代码,但只需修改下面代码中的一句即可:
[python]view plain
#
feature_cols=['TV','Radio','Newspaper']
#
X=data[feature_cols]
#
#X=data[['TV','Radio','Newspaper']]#只需修改这里即可<prename="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
最后的到的系数与测度如下:
LinearRegression(_X=True, fit_intercept=True, normalize=False)
然后再次使用ROC曲线来观测曲线的整体情况。我们在将Newspaper这个特征移除之后,得到RMSE变小了,说明Newspaper特征可能不适合作为预测销量的特征,于是,我们得到了新的模型。我们还可以通过不同的特征组合得到新的模型,看看最终的误差是如何的。
备注:
之前我提到了这种错误:
注:上面的结果是由train_test_spilit()得到的,但是我不知道为什么我的版本的sklearn包中居然报错:
处理方法:1、我后来重新安装sklearn包。再一次调用时就没有错误了。
2、自己写函数来认为的随机构造训练集和测试集。(这个代码我会在最后附上。)
这里我给出我自己写的函数:
Ⅳ 如何用神经网络实现连续型变量的回归预测
神经网络最开始是机器学习的一种模型,但其训练的时间和其他几种模型相比不占优势,且结果也不尽人意,所以一直没有被广泛使用。但随着数学的深入研究以及计算机硬件质量的提高,尤其是GPU的出现,给深度学习的广泛应用提供了基础。GPU最初是为了给游戏玩家带来高质量的视觉体验,由于其处理矩阵运算的能力特别优秀,也被用于深度学习中模型的训练,以往数十天才能训练好的模型在GPU上训练几天就可以训练好,大大减少了深度学习的训练时间,因而深度学习的应用越来越多。
通常使用Python来搭建神经网络,Python自带深度学习的一些库,在进行回归预测时,我们只需用调用函数,设定几个参数,如隐藏层层数和神经元个数等,剩下的就是等模型自行训练,最终便能完成回归预测,非常的方便。
Ⅵ 使用Python的线性回归问题,怎么解决
本文中,我们将进行大量的编程——但在这之前,我们先介绍一下我们今天要解决的实例问题。
1) 预测房子价格
闪电侠是一部由剧作家/制片人Greg Berlanti、Andrew Kreisberg和Geoff Johns创作,由CW电视台播放的美国电视连续剧。它基于DC漫画角色闪电侠(Barry Allen),一个具有超人速度移动能力的装扮奇特的打击犯罪的超级英雄,这个角色是由Robert Kanigher、John Broome和Carmine Infantino创作。它是绿箭侠的衍生作品,存在于同一世界。该剧集的试播篇由Berlanti、Kreisberg和Johns写作,David Nutter执导。该剧集于2014年10月7日在北美首映,成为CW电视台收视率最高的电视节目。
绿箭侠是一部由剧作家/制片人 Greg Berlanti、Marc Guggenheim和Andrew Kreisberg创作的电视连续剧。它基于DC漫画角色绿箭侠,一个由Mort Weisinger和George Papp创作的装扮奇特的犯罪打击战士。它于2012年10月10日在北美首映,与2012年末开始全球播出。主要拍摄于Vancouver、British Columbia、Canada,该系列讲述了亿万花花公子Oliver Queen,由Stephen Amell扮演,被困在敌人的岛屿上五年之后,回到家乡打击犯罪和腐败,成为一名武器是弓箭的神秘义务警员。不像漫画书中,Queen最初没有使用化名”绿箭侠“。
由于这两个节目并列为我最喜爱的电视节目头衔,我一直想知道哪个节目更受其他人欢迎——谁会最终赢得这场收视率之战。 所以让我们写一个程序来预测哪个电视节目会有更多观众。 我们需要一个数据集,给出每一集的观众。幸运地,我从维基网络上得到了这个数据,并整理成一个.csv文件。它如下所示。
闪电侠
闪电侠美国观众数
绿箭侠
绿箭侠美国观众数
1 4.83 1 2.84
2 4.27 2 2.32
3 3.59 3 2.55
4 3.53 4 2.49
5 3.46 5 2.73
6 3.73 6 2.6
7 3.47 7 2.64
8 4.34 8 3.92
9 4.66 9 3.06
观众数以百万为单位。
解决问题的步骤:
首先我们需要把数据转换为X_parameters和Y_parameters,不过这里我们有两个X_parameters和Y_parameters。因此,把他们命名为flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter吧。然后我们需要把数据拟合为两个不同的线性回归模型——先是闪电侠,然后是绿箭侠。 接着我们需要预测两个电视节目下一集的观众数量。 然后我们可以比较结果,推测哪个节目会有更多观众。
步骤1
导入我们的程序包:
Python
1
2
3
4
5
6
7
# Required Packages
import csv
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
步骤2
写一个函数,把我们的数据集作为输入,返回flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter values。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
现在我们有了我们的参数,来写一个函数,用上面这些参数作为输入,给出一个输出,预测哪个节目会有更多观众。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Function to know which Tv show will have more viewers
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1.fit(x1, y1)
predicted_value1 = regr1.predict(9)
print predicted_value1
regr2 = linear_model.LinearRegression()
regr2.fit(x2, y2)
predicted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 > predicted_value2:
print "The Flash Tv Show will have more viewers for next week"
else:
print "Arrow Tv Show will have more viewers for next week"
把所有东西写在一个文件中。打开你的编辑器,把它命名为prediction.py,复制下面的代码到prediction.py中。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Required Packages
import csv
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
# Function to know which Tv show will have more viewers
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1.fit(x1, y1)
predicted_value1 = regr1.predict(9)
print predicted_value1
regr2 = linear_model.LinearRegression()
regr2.fit(x2, y2)
predicted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 > predicted_value2:
print "The Flash Tv Show will have more viewers for next week"
else:
print "Arrow Tv Show will have more viewers for next week"
x1,y1,x2,y2 = get_data('input_data.csv')
#print x1,y1,x2,y2
more_viewers(x1,y1,x2,y2)
可能你能猜出哪个节目会有更多观众——但运行一下这个程序看看你猜的对不对。
3) 替换数据集中的缺失值
有时候,我们会遇到需要分析包含有缺失值的数据的情况。有些人会把这些缺失值舍去,接着分析;有些人会用最大值、最小值或平均值替换他们。平均值是三者中最好的,但可以用线性回归来有效地替换那些缺失值。
这种方法差不多像这样进行。
首先我们找到我们要替换那一列里的缺失值,并找出缺失值依赖于其他列的哪些数据。把缺失值那一列作为Y_parameters,把缺失值更依赖的那些列作为X_parameters,并把这些数据拟合为线性回归模型。现在就可以用缺失值更依赖的那些列预测缺失的那一列。
一旦这个过程完成了,我们就得到了没有任何缺失值的数据,供我们自由地分析数据。
为了练习,我会把这个问题留给你,所以请从网上获取一些缺失值数据,解决这个问题。一旦你完成了请留下你的评论。我很想看看你的结果。
个人小笔记:
我想分享我个人的数据挖掘经历。记得在我的数据挖掘引论课程上,教师开始很慢,解释了一些数据挖掘可以应用的领域以及一些基本概念。然后突然地,难度迅速上升。这令我的一些同学感到非常沮丧,被这个课程吓到,终于扼杀了他们对数据挖掘的兴趣。所以我想避免在我的博客文章中这样做。我想让事情更轻松随意。因此我尝试用有趣的例子,来使读者更舒服地学习,而不是感到无聊或被吓到。
谢谢读到这里——请在评论框里留下你的问题或建议,我很乐意回复你。
Ⅶ 如何用python实现含有虚拟自变量的回归
参考资料:
DataRobot | Ordinary Least Squares in Python
DataRoboe | Multiple Regression using Statsmodels
AnalyticsVidhya | 7 Types of Regression Techniques you should know!
Ⅷ 每个数据科学人都应该知道的7种回归技术
介绍 线性回归和逻辑回归通常是人们在数据科学中学习的第一种算法。由于它们的受欢迎程度,许多分析师甚至认为它们是唯一的回归形式。哪儿些稍微有工作经验的人也会认为它们是所有回归分析形式的中最重要的。
事实是,有无数种形式的回归可以使用。每种形式的回归都有其自身的重要性和最适合应用的特定场景。在本文中,我会以简单的方式解释了数据科学中最常用的7种回归形式。通过这篇文章,我也希望人们能够对回归的广度有一个概念,而不是仅仅对他们遇到的每个问题应都用线性/逻辑回归,并希望他们能够使用这么多的回归技术!
如果您是数据科学的新手,并且正在寻找一个开始学习的地方,那么“ 数据科学 ”课程是一个很好的起点!它涵盖了Python,统计和预测建模的核心主题,它是你进入数据科学的第一步的完美方法。
什么是回归分析?
回归分析是预测建模技术的一种技术,它研究依赖(目标)和自变量(预测变量)之间的关系。该技术用于预测,时间序列建模和查找变量之间的因果关系。例如,通过回归可以最好地研究鲁莽驾驶与驾驶员发生道路交通事故数量之间的关系。
回归分析是建模和分析数据的重要工具。在这里,我们将曲线/直线线拟合到数据点,使得数据点距曲线或直线的距离之间的差异最小化。我将在接下来的章节中详细解释这一点。
为什么我们使用回归分析?
如上所述,回归分析是估计两个或更多变量之间的关系。让我们通过一个简单的例子来理解这一点:
比方说,你想根据当前的经济状况估算公司的销售增长率。您有最近的公司数据表明销售增长约为经济增长的2.5倍。利用这种洞察力,我们可以根据当前和过去的信息预测公司的未来销售情况。
使用回归分析有许多好处。如下:
它表明因变量和自变量之间的显着关系。 它表示多个自变量对一个因变量的影响强度。
回归分析还允许我们比较不同尺度上测量的变量的影响,例如价格变化的影响和促销活动的数量。这些优势有助于市场研究人员/数据分析师/数据科学家消除和评估用于构建预测模型的最佳变量集。
我们有多少种回归技术?
我们有各种各样的回归技术可用用于预测。这些技术主要由三个指标(自变量的数量,因变量的类型和回归线的形状)驱动。我们将在以下部分详细讨论它们。
对于创造性的,如果您觉得需要使用上述参数的组合,您甚至可以制作新的回归,以前人们没有使用过。但在开始之前,让我们了解最常用的回归:
1.线性回归
它是最广为人知的建模技术之一。线性回归通常是人们在学习预测建模时最先选择的几个方法之一。在该方法中,因变量是连续的,自变量可以是连续的或离散的,并且回归线的性质是线性的。
线性回归使用最佳拟合直线(也称为回归线)在因变量(Y)和一个或多个自变量(X)之间建立关系。
它由方程Y = a + b * X + e表示,其中a是截距,b是直线的斜率,e是误差项。该等式可以根据给定的预测变量预测目标变量的值。
简单线性回归和多元线性回归之间的区别在于,多元线性回归具有(> 1)个独立变量,而简单线性回归只有1个独立变量。现在的问题是“我们如何获得最佳拟合线?”。
如何获得最佳拟合线(a和b的值)?
这项任务可以通过最小二乘法轻松完成。它是用于拟合回归线的最常用方法。它通过最小化每个数据点到直线的垂直偏差的平方和来计算观测数据的最佳拟合线。因为偏差首先要平方,所以当相加时,正值和负值之间不会抵消。
我们可以使用度量的R平方来评估模型性能 。
重点: 自变量和因变量之间必须存在线性关系 多元回归存在多重共线性,自相关,异方差等问题。 线性回归对异常值非常敏感。它可以极大地影响回归线并最终影响预测值。 多重共线性可以增加系数估计的方差,并使估计对模型中的微小变化非常敏感。结果是系数估计不稳定 在多个独立变量的情况下,我们可以选择正向选择,逆向淘汰和逐步方法来选择最重要的自变量。 2. 逻辑回归
逻辑回归方法用于查找事件成功的概率和失败的概率。当因变量本质上是二进制(0/1,真/假,是/否)时,我们应该使用逻辑回归。这里Y值的范围从0到1,它可以用下面的等式表示。
odds = p /(1-p)=事件发生概率/非事件发生概率 ln(赔率)= ln(p /(1-p)) logit(p)= ln(p /(1-p))= b0 + b1X1 + b2X2 + b3X3 .... + bkXk
以上,p是存在感兴趣特征的概率。这时候你应该要问一个问题就是“为什么我们要在等式中使用对数log?”。
由于我们在这里使用的是二项分布(因变量),我们需要选择最适合此分布的链接函数。而且,它是logit函数。在上面的等式中,选择此参数是为了以最大化观察样本值的可能性,而不是最小化平方误差的总和(如在普通回归中一样)。
重点: 它被广泛用于分类问题 逻辑回归不需要依赖因变量和自变量之间的线性关系。它可以处理各种类型的关系,因为它将非线性对数变换应用于预测的优势比 为避免过度拟合和欠拟合,我们应该包括所有重要的变量。确保这种做法的一个好方法是使用逐步方法来估计逻辑回归 它需要较大样本量,因为在样本量较小时,最大似然估计的效率低于普通的最小二乘法 自变量不应相互关联,即不具有多重共线性。但是,我们可以选择在分析和模型中包含分类变量的交互作用。 如果因变量的值是序数,那么它被称为序数逻辑回归 如果因变量是多类的,那么它被称为多元逻辑回归。 3.多项式回归
如果自变量的幂大于1,则回归方程是多项式回归方程。下面的等式表示多项式方程:
Y = A + B * X ^ 2
在这种回归技术中,最佳拟合线不是直线。它是一条与数据点吻合的曲线。
重点: 虽然可能存在拟合更高次多项式以获得更低误差的诱惑,但这可能会导致过度拟合。始终绘制关系图以查看是否匹配,并专注于确保曲线符合问题的本质。以下是绘图如何帮助的示例: 特别注意的是末端的曲线,看看这些形状和趋势是否有意义。较高的多项式最终会产生奇怪的结果。 4.逐步回归
当我们处理多个自变量时,会使用这种形式的回归。在这种技术中,自变量的选择是在自动过程的帮助下完成的,这个过程是不需要人为的去进行干预的。
通过观察R方、t检验和AIC指标等统计值来识别重要变量,可以实现这一壮举。逐步回归基本上适合回归模型,通过基于指定的标准一次一个地添加/删除协变量。下面列出了一些最常用的逐步回归方法:
标准逐步回归做两件事。它根据每个步骤的需要添加和删除预测变量。 正向选择从模型中最重要的预测变量开始,并为每个步骤添加变量。 向后消除从模型中的所有预测变量开始,并删除每个步骤的最不重要的变量。
该建模技术的目的是以最少的预测变量来最大化预测能力。它是处理数据集更高维度的方法之一。
5.岭回归
岭回归是一种在数据存在多重共线性(自变量高度相关)时使用的技术。在多重共线性中,即使最小二乘估计(OLS)是无偏的,但它们的方差也很大,这使得观测值偏离真实值。通过在回归估计中增加一定程度的偏差,岭回归可以减少标准误差。
上面,我们看到了线性回归的方程。还记得嘛?它可以表示为:
y = a + b * x
这个方程也有一个误差项。完整的等式变为:
y = a + b * x + e(误差项),[误差项是校正观测值和预测值之间预测误差所需的值] 表示多个自变量,=> y = a + y = a + b1x1 + b2x2 + .... + e。
在线性方程中,预测误差可以分解为两个子分量。首先是由于偏差,第二是由于方差。由于这两个或两个组件中的任何一个,都可能发生预测错误。在这里,我们将讨论由于方差引起的错误。
岭回归通过收缩参数 λ(lambda)解决了多重共线性问题 。看下面的方程。
在这个方程中,我们有两个组成部分。第一个是最小二乘项,另一个是β2 (β平方)总和的λ,其中β是系数。这被添加到最小二乘项,以便缩小参数以具有非常低的方差。
重点: 该回归的假设与最小二乘回归相同,但不假设正态性 它会缩小系数的值,但不会达到零,这表明没有特征选择功能 这是一种正则化方法,并使用l2正则化。 6.Lasso回归
类似于岭回归,Lasso(最小绝对收缩和选择算子)也会对回归系数的绝对大小进行限制。此外,它还能够降低线性回归模型的可变性并提高其准确性。请看下面的方程:
Lasso回归与岭回归的不同之处在于,它在惩罚函数中使用绝对值而不是平方。这导致惩罚(或等效地约束估计值的绝对值的总和)值,从而导致一些参数估计值恰好为零。应用的惩罚越大,估计值就会缩小到绝对零值。这导致从给定的n个变量中进行变量选择。
重点: 该回归的假设与最小二乘回归相同,但不假设正态性 它将系数缩小到零(恰好为零),这肯定有助于特征选择 这是一种正则化方法并使用l1正则化 如果预测变量高度相关,则Lasso仅选取其中一个并将其他预测缩减为零 7.弹性网络回归
弹性网络回归是Lasso回归和岭回归技术的混合体。它使用L1和L2先验作为正则化器进行训练。当存在多个相关的特征时,弹性网络是很有用的。Lasso可能随机选择其中一种,而弹性网很可能同时选择两个。
在Lasso回归和岭回归之间进行权衡的一个实际优势是,它允许弹性网络在旋转下继承岭回归的一些稳定性。
重点: 在变量高度相关的情况下,它鼓励群体效应 所选变量的数量没有限制 它会受到双重收缩的影响 如何选择正确的回归模型?
当你只知道一两种技术时,生活通常是很简单的。我所知道的其中一个培训机构告诉他们的学生 - 如果结果是连续的 - 那就用线性回归。如果是二进制的 - 那就用逻辑回归!但是,我们可以使用的选项数量越多,选择正确的选项就越困难。回归模型也会发生类似的情况。
在多种类型的回归模型中,基于自变量和因变量的类型,数据中的维度以及数据的其他基本特征来选择最适合的回归方法是很重要的。以下是应该选择正确的回归模型的关键因素:
数据挖掘是构建预测模型的必然部分。在选择正确的模型之前,应该首先确定变量之间的相关系数和影响 为了比较不同模型的拟合优度,我们可以分析不同的指标,如参数的统计显着性,R方,调整后的R方,AIC指标,BIC指标和误差项。另一个是Mallow的Cp标准。这基本上通过将模型与所有可能的子模型(仔细选择它们)进行比较,来检查模型中可能存在的偏差。 交叉验证是评估用于预测的模型的最佳方式。在这里,可以将数据集分为两组(训练和验证)。观测值和预测值之间的简单均方差可以衡量预测的准确性。 如果你的数据集有多个混淆变量,则不应选择自动模型选择方法,因为你不会希望同时将它们放在模型中。 这也取决于你的目标。与具有高度统计意义的模型相比,功能较弱的模型更容易实现。 回归正则化方法(Lasso回归,岭回归和弹性网络回归)在数据集中各变量之间具有高维度和多重共线性的情况下运行良好。 结束语
到现在为止,我希望你已经对回归有所了解。考虑数据条件来应用这些回归技术。找出使用哪种技术的最佳技巧之一就是检查变量族,即离散变量还是连续变量。
在本文中,我讨论了7种类型的回归以及与每种技术相关的一些关键事实。作为这个行业的新人,我建议你学习这些技术,然后在你的模型中实现它们。
-以上就是作者推荐的七种数据科学人必知必会的七种回归模型,如果大家对这七种模型感兴趣,那就自己动手去实验一下吧,只知道理论是不够的,要多动手实验,才能真正的掌握这些模型。
7 Types of Regression Techniques you should know!
Ⅸ 如何用Python进行线性回归以及误差分析
如何用Python进行线性回归以及误差分析
如果你想要重命名,只需要按下:
CTRL-b
状态条将会改变,这时你将可以重命名当前的窗口
一旦在一个会话中创建多个窗口,我们需要在这些窗口间移动的办法。窗口像数组一样组织在一起,从0开始用数字标记每个窗口,想要快速跳转到其余窗口:
CTRL-b 《窗口号》
如果我们给窗口起了名字,我们可以使用下面的命令找到它们:
CTRL-b f
也可以列出所有窗口:
CTRL-b w
Ⅹ python如何做数据分析
用Python做数据分析,大致流程如下:
1、数据获取
可以通过SQL查询语句来获取数据库中想要数据。Python已经具有连接sql server、mysql、orcale等主流数据库的接口包,比如pymssql、pymysql、cx_Oracle等。
2、数据存储
企业当中的数据存储,通过通过数据库如Mysql来存储与管理,对于非结构化数据的存储可以使用MongoDB等。对于使用Python进行网络抓取的数据,我们也可以使用pymysql包快速地将其存储到Mysql中去。
3、数据预处理/数据清洗
大多数情况下,原始数据是存在格式不一致,存在异常值、缺失值等问题的,而不同项目数据预处理步骤的方法也不一样。Python做数据清洗,可以使用Numpy和Pandas这两个工具库。
4、数据建模与分析
常见的数据挖掘模型有:分类、聚类、回归等,这些常见的算法模型,Python也有Scikit-learn和Tensorflow工具库来支持。
5、数据可视化分析
在数据可视化方面,Python有Matplotlib、Seaborn、Pyecharts等工具库可用。