关闭

scikit-learn学习之回归分析

标签: scikit-learn算法线性回归Regession
13520人阅读 评论(0) 收藏 举报
分类:
======================================================================
本系列博客主要参考 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平方值计算示例

#coding:utf-8
'''
Created on 2015年11月8日

@author: Administrator
'''
import numpy as np
import math

#求解皮尔逊相关系数
def computeCorrelation(X, Y):
    xBar = np.mean(X)
    yBar = np.mean(Y)
    SSR = 0
    varX = 0
    varY = 0
    for i in range(0, len(X)):
        #对应分子部分
        diffXXBar = X[i] - xBar
        diffYYBar = Y[i] - yBar
        SSR +=(diffXXBar * diffYYBar)
        #对应分母求和部分
        varX += diffXXBar**2
        varY += diffYYBar**2
    SST = math.sqrt(varX * varY)
    return SSR/SST

def polyfit(x, y, degree):
    results = {}
    #coeffs 为相关系数,x自变量,y因变量,degree为最高幂
    coeffs = np.polyfit(x, y, degree)
    
    #定义一个字典存放值,值为相关系数list
    results['polynomial'] = coeffs.tolist()
    
    #p相当于直线方程
    p = np.poly1d(coeffs)  
    yhat = p(x)  #传入x,计算预测值为yhat
    
    ybar = np.sum(y)/len(y)  #计算均值    
    #对应公式
    ssreg = np.sum((yhat - ybar) ** 2)
    sstot = np.sum((y - ybar) ** 2)
    results['determination'] = ssreg / sstot

    print" results :",results
    return results



testX = [1, 3, 8, 7, 9]
testY = [10, 12, 24, 21, 34]

#输出的是简单线性回归的皮尔逊相关度和R平方值
print "r : ",computeCorrelation(testX, testY)
print "r^2 : ",str(computeCorrelation(testX, testY)**2)

#
print polyfit(testX, testY, 1)["determination"]

结果显示为:


二:简单线性回归


1:回归与分类的区别

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


2:简单线性回归介绍

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

3:简单线性回归示例

<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf8
'''
Created on 2016年4月24日

@author: Gamer Think
'''
#Simple Regession
import numpy as np

#周广告播放数量
x = [1,3,2,1,3]
#周汽车销售数据
y = [14,24,18,17,27]

#使用最小二乘法
def fitSLR(x,y):
    n = len(x)
    denominator  = 0
    numerator = 0
    for i in range(0,n):
        numerator += (x[i]-np.mean(x)* (y[i]-np.mean(y)) )
        denominator += (x[i]-np.mean(x))**2
    
    print "denominator:",denominator
    print "numerator:",numerator
    
    b1 = numerator/float(denominator)
#     b0 = np.mean(y)/float(np.mean(x)) 
    b0 = np.mean(y)-b1*np.mean(x)
    
    return b0,b1

def predict(b0,b1,x):
    return b0+b1*x

b0,b1 = fitSLR(x,y)

x_test = 6
print "y_test:",predict(b0,b1,x_test)</span></span>

:多元性回归

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

                                                               
                     我们需要的数据是第二,三,四列的数据
<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf-8
'''
Created on 2016年4月24日

@author: Gamer Think
'''
from sklearn import linear_model
import numpy as np
from numpy import genfromtxt #可以将非array格式的list转化为array

datapath = "data.csv"
deliverData = genfromtxt(datapath,delimiter=",") #将csv文件转化为numpy.array格式

print "data:",deliverData

X= deliverData[:,:-1]
Y = deliverData[:,-1]
print "X:",X
print "Y:",Y

regr = linear_model.LinearRegression()
regr.fit(X,Y)

print "coefficients:",regr.coef_        #与X结合的值
print "intercept:",regr.intercept_         #类似于截距

x_pre = [102,6]
y_pre = regr.predict(x_pre)
print "Y-Predict:",y_pre
</span></span>

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

               首先将分类型变量进行转化为如下形式(第四五六列表示0,1,2,为1表示使用该型号车)
             
             调用的代码其实和上边的是一样的:
<span style="font-family:Microsoft YaHei;"><span style="font-family:Microsoft YaHei;font-size:18px;">#coding:utf-8
'''
Created on 2016年4月24日

@author: Gamer Think
'''
from numpy import genfromtxt
import numpy as np
from sklearn import datasets, linear_model

dataPath = "dataDumpy.csv"
deleveryData = genfromtxt(dataPath, delimiter=',')

print "data:\n",deleveryData

X = deleveryData[:, :-1]
Y = deleveryData[:, -1]
print "X: ",X
print "Y: ",Y
 
regr = linear_model.LinearRegression()
regr.fit(X, Y)
 
print "Coefficients:",regr.coef_  #与X结合的值
print "Intercept:",regr.intercept_ #类似于截距
# 
xPred = [102,6,0,0,1]
yPred = regr.predict(xPred)
print "predict y : ",yPred</span></span>


 4:关于误差


 

四:非线性回归

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

1:概率

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


非线性回归实例:

<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf-8
'''
Created on 2016年4月24日

@author: Gamer Think
'''
import numpy as np
import random

'''
梯度下降算法
参数说明:X,Y
theta:一组向量和x相乘的一组值
alpha:梯度下降时的参数,即每一步下降多少
m:实例的个数
numIteration:迭代计算的次数,可以理解为梯度下降多少步
'''
def gradientDescent(X,Y,theta,alpha,m,numIteration):
    x_trains = X.transpose()  #X的转置矩阵
    for i in range(0,numIteration):    
        hypothesis = np.dot(X,theta)      #内积形式,X与theta的乘积  ,求出y的估计值
        loss = hypothesis - Y             #估计值与真实值之间的差
        
        #通用的梯度下降算法,和logistic Regession中所描述的cost函数不一致
        cos = np.sum(loss**2)/(2*m)
        print "Iteration %d | Cost:%f" % (i,cos)
        
        gradient = np.dot(x_trains,loss)/m
        theta = theta - alpha*gradient
        
    return theta


'''
numPoints : 点的个数
bias :偏好ֵ
variance : 统计学概念, 偏差和
产生样本点和对应的标签 
'''
def genData(numPoints,bias,variance):
    X = np.zeros(shape=(numPoints,2))     #归类的数据
    Y = np.zeros(shape=numPoints)         #归类的标签
    
    for i in range(0,numPoints):   #从0~len(numPoints)-1执行如下
        X[i][0] = 1
        X[i][1] = i
        #制造target数据
        Y[i] = (i+bias) + random.uniform(0,1)*variance
        
    return X,Y

X,Y = genData(100, 25, 10)
# print  "X:",X
# print  "Y:",Y

m, n = np.shape(X)
n_y = np.shape(Y)

# print "x shape :", m, "  ", n
# print "y length :",n_y

numIterations =100000
alpha = 0.0005
theta = np.ones(n)
theta = gradientDescent(X, Y, theta, alpha, m, numIterations)

print "theta: " ,theta

</span></span>

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

0
0
查看评论

Python实现机器学习二(实现多元线性回归)

接着上一次的一元线性回归http://blog.csdn.net/lulei1217/article/details/49385531往下讲,这篇文章要讲解的多元线性回归。 1、什么是多元线性回归模型? 当y值的影响因素不唯一时,采用多元线性回归模型。   y =y=β0+...
  • LULEI1217
  • LULEI1217
  • 2015-10-25 15:45
  • 27902

机器学习系列:(五)决策树——非线性回归与分类

决策树——非线性回归与分类 前面几章,我们介绍的模型都是广义线性模型,基本方法都是通过联接方程构建解释变量与若干响应变量的关联关系。我们用多元线性回归解决回归问题,逻辑回归解决分类问题。本章我们要讨论一种简单的非线性模型,用来解决回归与分类问题,称为决策树(decision tree)。首先,...
  • cjianwyr
  • cjianwyr
  • 2017-02-07 10:33
  • 509

机器学习逻辑回归模型总结——从原理到sklearn实践

0x00 基本原理逻辑回归算法,从名字上看似乎是个回归问题,但实际上逻辑回归是个典型的分类算法。 对于分类问题,一般都是一些离散变量,且y的取值如下: y∈{0,1,2,3,...,n}y \in \{0, 1, 2, 3, ..., n\},显然不能使用线性回归拟合。 以二元分类问题开始讨论...
  • u011721501
  • u011721501
  • 2015-11-05 13:31
  • 9075

30分钟学会用scikit-learn的基本回归方法(线性、决策树、SVM、KNN)和集成方法(随机森林,Adaboost和GBRT)

真注:本教程是本人尝试使用scikit-learn的一些经验,scikit-learn帧的超级容易上手,简单实用。30分钟学会用调用基本的回归方法和集成方法应该是够了。 本文主要参考了scikit-learn的官方网站 前言:本教程主要使用了numpy的最最基本的功能,用于生成数据,matplo...
  • u010900574
  • u010900574
  • 2016-09-26 03:16
  • 9572

【scikit-learn】scikit-learn的线性回归模型

内容概要 如何使用pandas读入数据如何使用seaborn进行数据的可视化scikit-learn的线性回归模型和使用方法线性回归模型的评估测度特征选择的方法 作为有监督学习,分类问题是预测类别结果,而回归问题是预测一个连续的结果。 1. 使用pandas来读取...
  • JasonDing1354
  • JasonDing1354
  • 2015-06-03 09:21
  • 9578

Scikit-Learn与回归树

回归算法原理 CART(Classification and Regression Tree)算法是目前决策树算法中最为成熟的一类算法,应用范围也比较广泛。它既可以用于分类。 西方预测理论一般都是基于回归的,CART是一种通过决策树方法实现回归的算法,它具有很多其他全局回归算法不具有的特性...
  • u011437229
  • u011437229
  • 2016-11-18 21:04
  • 2141

SVM详解(包含它的参数C为什么影响着分类器行为)-scikit-learn拟合线性和非线性的SVM

引言这篇文章详细地介绍了SVM背后的原理,它为什么是大间距分类器?分类器的参数C为什么影响着分类器的行为?核函数背后采用了什么样的技术,看过这篇文章以后,相信你能很好地理解这些问题。最后,我用scikit-learn来分别来拟合线性和非线性的SVM,让大家对SVM分类器有更加深刻的理解。找寻最优化目...
  • xlinsist
  • xlinsist
  • 2016-05-05 15:13
  • 7508

scikit-learn : 线性回归,多元回归,多项式回归

使用scikit-learn学习线性回归,多元回归,多项式回归
  • SA14023053
  • SA14023053
  • 2016-06-17 23:36
  • 17116

Sklearn-LogisticRegression逻辑回归

逻辑回归: 可以做概率预测,也可用于分类,仅能用于线性问题。通过计算真实值与预测值的概率,然后变换成损失函数,求损失函数最小值来计算模型参数,从而得出模型。   sklearn.linear_model.LogisticRegression官方API: 官方API:http:/...
  • CherDW
  • CherDW
  • 2017-02-06 11:19
  • 8904

Python机器学习库sklearn几种回归算法建模及分析(实验)

最简单的回归模型就是线性回归 数据导入与可视化分析 from IPython.display import Image %matplotlib inline # Added version check for recent scikit-learn 0.18 checks from distu...
  • cymy001
  • cymy001
  • 2017-11-17 05:28
  • 245
    微信公众号【数据与算法联盟】

    扫码关注公众号,不定期推送实战文章!

    扫码加我微信,拉你进数据算法大佬群!
    个人资料
    • 访问:1066110次
    • 积分:11758
    • 等级:
    • 排名:第1530名
    • 原创:227篇
    • 转载:22篇
    • 译文:2篇
    • 评论:343条
    个人简介
    姓名:Thinkgamer

    Github:https://github.com/thinkgamer

    主攻:云计算/python/数据分析

    程度:熟悉/熟悉/熟悉

    微信:gyt13342445911

    Email:thinkgamer@163.com

    工作状态:在职ing

    心灵鸡汤:只要努力,你就是下一个大牛...

    hadoop/spark/机器学习群:279807394(大神建的群,蹭个管理员)

    欢迎骚扰........
    博客专栏
    最新评论