转载: scikit-learn学习之回归分析

Posted _harvey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转载: scikit-learn学习之回归分析相关的知识,希望对你有一定的参考价值。

目录(?)[+]

======================================================================
本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正   

======================================================================

另外一篇基于《机器学习实战》的Logistic回归分析的博客请参考:点击阅读,其主要是采用Python代码实现回归模型

还有一篇是纯实战案例博客请参考 ,Logistic回归模型案例实战:《机器学习实战》Logistic回归算法(2)


目录:

1、概念

2、简单线性回归(Simple Liner Regession)

3、元性回归(Mutiple Regession)

4、非线性回归(Logistic Regession)


一:概念            

1:集中趋势衡量

        1.1均值(平均值,平均数)(mean)
        1.2中位数(median):将数据中的所有数按大小排列顺序,位于中间的拿个书就是中位数
                个数为奇数,取中间值
                个数为偶数,取中间两个数的平均值
        1.3众数:数据中出现最多的数

2:离散程度的衡量

        2.1方差(variance)
        2.2标准差(standard deviation)


3:回归中的相关度

     3.1:皮尔逊相关度
     衡量两个相关强度的量,取值范围是[-1,1],计算公式为:
技术分享

4:R平方值

决定系数(可决系数,拟合优度),反应因变量的全部变异能通过回归关系被自变量解释的比例,取值范围[0,1],可决系数越大,说明在总变差中由模型作出了解释的部分占的比重越大,模型拟合优度越好。反之可决系数小,说明模型对样本观测值的拟合程度越差。
描述:如R平方为0.8,则表示回归关系可以解释因变量80%的变异,换句话说,如果我们能控制自变量不变,则因变量变异程度将会减少80%
对于 简单线性回归来说,R^2= r * r
对于多元线性回归来说,
技术分享
SSR表示由模型引起的误差平方和,SST表示由实际值引起的差值平方和
 
R平方也有局限性,会随着自变量的增大而增大
一个关于相关系数的BBS:http://bbs.pinggu.org/thread-3034786-1-1.html


5:皮尔逊相关系数和R平方值计算示例

[python] view plain copy 技术分享技术分享
  1. #coding:utf-8  
  2. ‘‘‘‘‘ 
  3. Created on 2015年11月8日 
  4.  
  5. @author: Administrator 
  6. ‘‘‘  
  7. import numpy as np  
  8. import math  
  9.   
  10. #求解皮尔逊相关系数  
  11. def computeCorrelation(X, Y):  
  12.     xBar = np.mean(X)  
  13.     yBar = np.mean(Y)  
  14.     SSR = 0  
  15.     varX = 0  
  16.     varY = 0  
  17.     for i in range(0, len(X)):  
  18.         #对应分子部分  
  19.         diffXXBar = X[i] - xBar  
  20.         diffYYBar = Y[i] - yBar  
  21.         SSR +=(diffXXBar * diffYYBar)  
  22.         #对应分母求和部分  
  23.         varX += diffXXBar**2  
  24.         varY += diffYYBar**2  
  25.     SST = math.sqrt(varX * varY)  
  26.     return SSR/SST  
  27.   
  28. def polyfit(x, y, degree):  
  29.     results = {}  
  30.     #coeffs 为相关系数,x自变量,y因变量,degree为最高幂  
  31.     coeffs = np.polyfit(x, y, degree)  
  32.       
  33.     #定义一个字典存放值,值为相关系数list  
  34.     results[‘polynomial‘] = coeffs.tolist()  
  35.       
  36.     #p相当于直线方程  
  37.     p = np.poly1d(coeffs)    
  38.     yhat = p(x)  #传入x,计算预测值为yhat  
  39.       
  40.     ybar = np.sum(y)/len(y)  #计算均值      
  41.     #对应公式  
  42.     ssreg = np.sum((yhat - ybar) ** 2)  
  43.     sstot = np.sum((y - ybar) ** 2)  
  44.     results[‘determination‘] = ssreg / sstot  
  45.   
  46.     print" results :",results  
  47.     return results  
  48.   
  49.   
  50.   
  51. testX = [1, 3, 8, 7, 9]  
  52. testY = [10, 12, 24, 21, 34]  
  53.   
  54. #输出的是简单线性回归的皮尔逊相关度和R平方值  
  55. print "r : ",computeCorrelation(testX, testY)  
  56. print "r^2 : ",str(computeCorrelation(testX, testY)**2)  
  57.   
  58. #  
  59. print polyfit(testX, testY, 1)["determination"]  

结果显示为:
技术分享

二:简单线性回归


1:回归与分类的区别

       回归(regession):Y变量为连续型数值,如房价,人数,降雨量
       分类(classification):Y变量为类别型,如颜色类别,电脑品牌,有无信誉


2:简单线性回归介绍

       回归分析:是指建立方程模拟两个或者多个变量之间如何关联
       回归模型:是指被用来描述因变量(y)和自变量(x)以及偏差(error)之间的关系的方程,函数表示为:
                       技术分享
       简单线性回归方程:模型转变为技术分享即为回归方程(类似于一条直线,参数为斜率和y轴的交点)
       线性关系包含:正相关,负相关,无关
       估计线性方程:
                       技术分享
       关于偏差:
技术分享

3:简单线性回归示例

[python] view plain copy 技术分享技术分享
  1. <span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf8  
  2. ‘‘‘‘‘ 
  3. Created on 2016年4月24日 
  4.  
  5. @author: Gamer Think 
  6. ‘‘‘  
  7. #Simple Regession  
  8. import numpy as np  
  9.   
  10. #周广告播放数量  
  11. x = [1,3,2,1,3]  
  12. #周汽车销售数据  
  13. y = [14,24,18,17,27]  
  14.   
  15. #使用最小二乘法  
  16. def fitSLR(x,y):  
  17.     n = len(x)  
  18.     denominator  = 0  
  19.     numerator = 0  
  20.     for i in range(0,n):  
  21.         numerator += (x[i]-np.mean(x)* (y[i]-np.mean(y)) )  
  22.         denominator += (x[i]-np.mean(x))**2  
  23.       
  24.     print "denominator:",denominator  
  25.     print "numerator:",numerator  
  26.       
  27.     b1 = numerator/float(denominator)  
  28. #     b0 = np.mean(y)/float(np.mean(x))   
  29.     b0 = np.mean(y)-b1*np.mean(x)  
  30.       
  31.     return b0,b1  
  32.   
  33. def predict(b0,b1,x):  
  34.     return b0+b1*x  
  35.   
  36. b0,b1 = fitSLR(x,y)  
  37.   
  38. x_test = 6  
  39. print "y_test:",predict(b0,b1,x_test)</span></span>  

:多元性回归

1:多元回归简介
        与简单线性回归的区别:有多个变量x
        多元回归模型:
技术分享
多元回归方程:
技术分享
估计多元回归方程:(y变成y_hat,即求得是估计值)
技术分享
估计方法:
技术分享
2:多元线性回归示例

                                                               技术分享
                     我们需要的数据是第二,三,四列的数据
技术分享
 
[python] view plain copy 技术分享技术分享
  1. <span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf-8  
  2. ‘‘‘‘‘ 
  3. Created on 2016年4月24日 
  4.  
  5. @author: Gamer Think 
  6. ‘‘‘  
  7. from sklearn import linear_model  
  8. import numpy as np  
  9. from numpy import genfromtxt #可以将非array格式的list转化为array  
  10.   
  11. datapath = "data.csv"  
  12. deliverData = genfromtxt(datapath,delimiter=",") #将csv文件转化为numpy.array格式  
  13.   
  14. print "data:",deliverData  
  15.   
  16. X= deliverData[:,:-1]  
  17. Y = deliverData[:,-1]  
  18. print "X:",X  
  19. print "Y:",Y  
  20.   
  21. regr = linear_model.LinearRegression()  
  22. regr.fit(X,Y)  
  23.   
  24. print "coefficients:",regr.coef_        #与X结合的值  
  25. print "intercept:",regr.intercept_         #类似于截距  
  26.   
  27. x_pre = [102,6]  
  28. y_pre = regr.predict(x_pre)  
  29. print "Y-Predict:",y_pre  
  30. </span></span>  

3:如果自变量中有分类型变量(categorical data),如何处理?
     e g:
              技术分享

               首先将分类型变量进行转化为如下形式(第四五六列表示0,1,2,为1表示使用该型号车)
             技术分享
             调用的代码其实和上边的是一样的:
[python] view plain copy 技术分享技术分享
  1. <span style="font-family:Microsoft YaHei;"><span style="font-family:Microsoft YaHei;font-size:18px;">#coding:utf-8  
  2. ‘‘‘‘‘ 
  3. Created on 2016年4月24日 
  4.  
  5. @author: Gamer Think 
  6. ‘‘‘  
  7. from numpy import genfromtxt  
  8. import numpy as np  
  9. from sklearn import datasets, linear_model  
  10.   
  11. dataPath = "dataDumpy.csv"  
  12. deleveryData = genfromtxt(dataPath, delimiter=‘,‘)  
  13.   
  14. print "data:\n",deleveryData  
  15.   
  16. X = deleveryData[:, :-1]  
  17. Y = deleveryData[:, -1]  
  18. print "X: ",X  
  19. print "Y: ",Y  
  20.    
  21. regr = linear_model.LinearRegression()  
  22. regr.fit(X, Y)  
  23.    
  24. print "Coefficients:",regr.coef_  #与X结合的值  
  25. print "Intercept:",regr.intercept_ #类似于截距  
  26. #   
  27. xPred = [102,6,0,0,1]  
  28. yPred = regr.predict(xPred)  
  29. print "predict y : ",yPred</span></span>  


 4:关于误差

技术分享
 

四:非线性回归

    非线性回归又称为逻辑回归

1:概率

     对一件事情发生可能性的衡量,取值范围是0~1,计算方法包括,个人置信,历史数据,模拟数据
     条件概率:
技术分享
   技术分享
技术分享
技术分享
技术分享

非线性回归实例:

[python] view plain copy 技术分享技术分享
  1. <span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf-8  
  2. ‘‘‘‘‘ 
  3. Created on 2016年4月24日 
  4.  
  5. @author: Gamer Think 
  6. ‘‘‘  
  7. import numpy as np  
  8. import random  
  9.   
  10. ‘‘‘‘‘ 
  11. 梯度下降算法 
  12. 参数说明:X,Y 
  13. theta:一组向量和x相乘的一组值 
  14. alpha:梯度下降时的参数,即每一步下降多少 
  15. m:实例的个数 
  16. numIteration:迭代计算的次数,可以理解为梯度下降多少步 
  17. ‘‘‘  
  18. def gradientDescent(X,Y,theta,alpha,m,numIteration):  
  19.     x_trains = X.transpose()  #X的转置矩阵  
  20.     for i in range(0,numIteration):      
  21.         hypothesis = np.dot(X,theta)      #内积形式,X与theta的乘积  ,求出y的估计值  
  22.         loss = hypothesis - Y             #估计值与真实值之间的差  
  23.           
  24.         #通用的梯度下降算法,和logistic Regession中所描述的cost函数不一致  
  25.         cos = np.sum(loss**2)/(2*m)  
  26.         print "Iteration %d | Cost:%f" % (i,cos)  
  27.           
  28.         gradient = np.dot(x_trains,loss)/m  
  29.         theta = theta - alpha*gradient  
  30.           
  31.     return theta  
  32.   
  33.   
  34. ‘‘‘‘‘ 
  35. numPoints : 点的个数 
  36. bias :偏好? 
  37. variance : 统计学概念, 偏差和 
  38. 产生样本点和对应的标签  
  39. ‘‘‘  
  40. def genData(numPoints,bias,variance):  
  41.     X = np.zeros(shape=(numPoints,2))     #归类的数据  
  42.     Y = np.zeros(shape=numPoints)         #归类的标签  
  43.       
  44.     for i in range(0,numPoints):   #从0~len(numPoints)-1执行如下  
  45.         X[i][0] = 1  
  46.         X[i][1] = i  
  47.         #制造target数据  
  48.         Y[i] = (i+bias) + random.uniform(0,1)*variance  
  49.           
  50.     return X,Y  
  51.   
  52. X,Y = genData(100, 25, 10)  
  53. # print  "X:",X  
  54. # print  "Y:",Y  
  55.   
  56. m, n = np.shape(X)  
  57. n_y = np.shape(Y)  
  58.   
  59. # print "x shape :", m, "  ", n  
  60. # print "y length :",n_y  
  61.   
  62. numIterations =100000  
  63. alpha = 0.0005  
  64. theta = np.ones(n)  
  65. theta = gradientDescent(X, Y, theta, alpha, m, numIterations)  
  66.   
  67. print "theta: " ,theta  
  68.   
  69. </span></span>  
技术分享

点击 进入个人在有道云笔记的回归分析相关,感兴趣的可以看一下

以上是关于转载: scikit-learn学习之回归分析的主要内容,如果未能解决你的问题,请参考以下文章

大数据分析机器学习之岭回归-医疗心率数据分析

[Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归多项式回归逻辑回归)

机器学习之线性回归

机器学习之回归模型-梯度下降法求解线性回归

机器学习之python---Python实现逻辑回归(LogisticRegression)

轻松入门机器学习之概念总结