星期六, 十月 18, 2014

python中的线性回归

python中的线性回归

对于统计模型来说,最简单也最经典的模型要数线性回归模型,它可以满足统计建模的所有标准流程,并且适用范围也非常广。R里面是使用lm函数来做回归,而在python里面有几个包都提供了这一功能,首先介绍sklearn包中的回归函数,然后介绍statsmodels包中的回归函数。前者适合于机器学习中的预测,不需要太多中间结果的观察。后者适合于分析,需要对中间结果,例如系数,残差以及效果做判断的时候使用。

  • 第一步:加载各种包
In [228]:
%pylab inline
import pandas as pd
import matplotlib.pylab as ply
import statsmodels.api as sm
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import statsmodels.formula.api as sm
Populating the interactive namespace from numpy and matplotlib

  • 第二步:读取数据并画图
In [222]:
df = pd.read_csv('iris.csv')
lmdf = df[['Petal_Length','Petal_Width']]
lmdf.plot(kind='scatter',x=0,y=1)
Out[222]:
<matplotlib.axes.AxesSubplot at 0x119b1f110>
  • 第三步:使用sklearn包中的函数进行回归
In [230]:
# 建立回归对象
linear_sk = LinearRegression()
X=lmdf[['Petal_Length']]
y=lmdf['Petal_Width']
linear_sk.fit(X,y)
linear_fit.intercept_,linear_fit.coef_  # coef
Out[230]:
(-0.36651404521672837, array([ 0.41641913]))
In [226]:
linear_fit.score(X,y) # R2
Out[226]:
0.92690122792200369
In [214]:
yhat = linear_fit.predict(X=lmdf[['Petal_Length']])
mean_squared_error(lmdf['Petal_Width'],yhat)  #MSE
Out[214]:
0.04228994631948424
  • 第四步:观察回归效果
In [196]:
plt.scatter(lmdf['Petal_Length'],lmdf['Petal_Width'])
plt.plot(lmdf['Petal_Length'],yhat)
Out[196]:
[<matplotlib.lines.Line2D at 0x11991a790>]
  • 使用statmodels包的过程和结果,可以使用和R类似的公式实施
In [229]:
linear_model = sm.ols(formula='Petal_Width ~ Petal_Length', data=lmdf)
results = linear_model.fit()
results.summary()
Out[229]:
OLS Regression Results
Dep. Variable: Petal_Width R-squared: 0.927
Model: OLS Adj. R-squared: 0.926
Method: Least Squares F-statistic: 1877.
Date: Sat, 18 Oct 2014 Prob (F-statistic): 5.78e-86
Time: 18:00:43 Log-Likelihood: 24.400
No. Observations: 150 AIC: -44.80
Df Residuals: 148 BIC: -38.78
Df Model: 1
coef std err t P>|t| [95.0% Conf. Int.]
Intercept -0.3665 0.040 -9.188 0.000 -0.445 -0.288
Petal_Length 0.4164 0.010 43.320 0.000 0.397 0.435
Omnibus: 5.498 Durbin-Watson: 1.461
Prob(Omnibus): 0.064 Jarque-Bera (JB): 5.217
Skew: 0.353 Prob(JB): 0.0736
Kurtosis: 3.579 Cond. No. 10.3

星期四, 十月 16, 2014

pandas包绘图函数初步

python中绘图有很多包来支持,但总是觉得没有ggplot2有用。尽管如此,在探索数据时还是需要画些图来观察数据。尝试了很多方式,感觉比较方便的还是利用pandas包的附带绘图函数,可以做一些初步的探索性画图。它本身还是对matplotlib包的一个封装。下面的代码是画一些基本的图形,如线图,直方图,条形图,散点图。散点图映射点的color时要注意,不能直接把字符串进行映射,需要用scatter函数,并且需要用数值来映射到颜色。
In [6]:
%pylab inline
import pandas as pd
df= pd.read_csv('iris.csv')
df.head()
Populating the interactive namespace from numpy and matplotlib

Out[6]:
Sepal_Length Sepal_Width Petal_Length Petal_Width Species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
In [8]:
df.Sepal_Length.hist(by=df['Species'])
Out[8]:
array([[,
        ],
       [,
        ]], dtype=object)
In [9]:
df.ix[:,:4].plot(kind='line')
Out[9]:

In [10]:
df1= df.groupby('Species').mean()
df1.plot(kind='bar', stacked=True )
Out[10]:

In [12]:
df.ix[:,:4].plot(kind='scatter',x='Sepal_Length',y='Sepal_Width',by=df['Species'])
Out[12]:

In [13]:
scatter(df.Petal_Length,df.Petal_Width, c=tile([1,2,3],50))
Out[13]:

In []: