sklearn包含四种评价尺度
1 均方差(mean-squared-error)
2 平均绝对值误差(mean_absolute_error)
3 可释方差得分(explained_variance_score)
4 中值绝对误差(Median absolute error)
5 R2 决定系数(拟合优度)
模型越好:r2→1
模型越差:r2→0
二 逻辑斯蒂回归 1 概述在逻辑斯蒂回归中,我们将会采用sigmoid函数作为激励函数,所以它被称为sigmoid回归或对数几率回归(logistic regression),需要注意的是,虽然带有回归,但事实上它并不是一种回归算法,而是一种分类算法。
优点:
1 它是直接对分类的可能性进行建模的,无需事先假设数据分布,这样就避免了假设分布不准确所带来的问题
2 其针对于分类的可能性进行建模的,所以它不仅能预测出类别,还可以得到属于该类别的概率
3 实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低
4 数据量大就用逻辑斯蒂 数据量小,特征多,用SVM knn
缺点:
容易欠拟合,分类精度可能不高
线性回归与逻辑回归的区别
线性回归: 线性回归用来做回归预测,解决回归问题
根据几组已知数据和拟合函数训练其中未知参数,使得拟合损失达到最小。然后用所得拟合函数进行预测。
逻辑回归: 逻辑回归用于做二分类 , 解决分类问题
和拟合函数训练其中未知参数 , 使得对数似然函数最大。然后用所得的拟合函数进行二分类。
线性回归 逻辑回归目的 预测 分类
未知 {0,1}
函数 拟合函数 预测函数
参数计算方式 最小二乘 最大似然估计
注意:
1 预测函数其实就是拟合函数做了一个逻辑函数的转换
2 最大似然估计是计算使得数据出现的可能性最大的参数,依仗的自然是Probability。而最小二乘是计算误差损失。因此两者不可混淆
(2) 本质的区分逻辑回归就是对线性回归做了一个压缩,将y 的值从y∈(+∞,−∞)压缩到(0,1)。为什么简单的压缩就能将回归问题变成分类问题?
从数据说起,线性回归的样本的输出,都是连续值,y∈(+∞,−∞)而,逻辑回归中y∈{0,1},只能取0和1。对于拟合函数也有本质上的差别:
\[ 逻辑回归:f(x)=p(y=1∣x;θ)=g(θTX) \]
\[ 线性回归:f(x)=θTX=θ1x1+θ2x2+⋯+θnxn \]
线性回归拟合函数,的确是对f(x)的输出变量y的拟合,而逻辑回归的拟合函数是对为1类的样本概率拟合。
为什么采用1类的样本概率进行拟合,这里就要谈到logstic函数的本质
若要直接通过回归的方法去预测二分类问题, y 到底是0类还是1类,最好的函数是单位阶跃函数。然而单位阶跃函数不连续(GLM 的必要条件),而 logsitic 函数恰好接近于单位阶跃函数,且单调可微。于是希望通过该复合函数去拟合分类问题,产生:
于是,θTX=0就相当于是1类和0类的决策边界:
\[ 当θTX>0,则有y>0.5;若θTX→+∞ ,则y→1 ,即y 为1类; \]
\[ 当θTX<0,则有y<0.5 ; 若θTX→−∞,则y→0,即 y 为0类。 \]
这个时候就能看出区别来了,在线性回归中θTXθTX为预测值的拟合函数;而在逻辑回归中θTX=0为决策边界
因此利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。
三 Logistic Regression实战练习实例: 手写数字分类
import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt %matplotlib inline # LogisticRegression虽然是线性回归模型,但是只能处理分类问题 # 概率模型,使用概率进行分类 from sklearn.linear_model import LogisticRegression from sklearn.neighbors import KNeighborsClassifier # 加载手写数字集 from sklearn import datasets digits = datasets.load_digits() # #输出 {'data': array([[ 0., 0., 5., ..., 0., 0., 0.], [ 0., 0., 0., ..., 10., 0., 0.], [ 0., 0., 0., ..., 16., 9., 0.], ..., [ 0., 0., 1., ..., 6., 0., 0.], [ 0., 0., 2., ..., 12., 0., 0.], [ 0., 0., 10., ..., 12., 1., 0.]]), 'target': array([0, 1, 2, ..., 8, 9, 8]), 'target_names': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'images': array([[[ 0., 0., 5., ..., 1., 0., 0.], [ 0., 0., 13., ..., 15., 5., 0.], .... data = digits.data #(1797, 64) 表示1797条,一维64的矩阵 images = digits.images #(1797, 8, 8) 表示1797条,8*8的二维矩阵 display(data.shape,images.shape) plt.imshow(images[0],cmap='gray') plt.imshow(data[0].reshape((8,8)),cmap='gray') #将64一维转成8*8的二维矩阵实际都是表示一组数据