传智播客 回归问题 学习笔记

目录

分类算法之逻辑回归

逻辑回归

sklearn.linear_model.LogisticRegression

属性

特点分析

逻辑回归算法案例分析

良/恶性乳腺癌肿瘤预测

回归算法之线性回归

损失函数

梯度下降算法

LinearRegression

sklearn.linear_model.LinearRegression

方法

属性

加入交叉验证

线性回归案例分析

波士顿房价预测

欠拟合与过拟合

解决过拟合的方法

欠拟合

过拟合

回归算法之岭回归

sklearn.linear_model.Ridge

方法

属性

岭回归案例分析


 

回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于连续型分布预测,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。

回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。那么什么是线性关系和非线性关系?

比如说在房价上,房子的面积和房子的价格有着明显的关系。那么X=房间大小,Y=房价,那么在坐标系中可以看到这些点:

 

传智播客 回归问题 学习笔记_第1张图片

那么通过一条直线把这个关系描述出来,叫线性关系

 

传智播客 回归问题 学习笔记_第2张图片

如果是一条曲线,那么叫非线性关系

 

传智播客 回归问题 学习笔记_第3张图片

那么回归的目的就是建立一个回归方程(函数)用来预测目标值,回归的求解就是求这个回归方程的回归系数。

分类算法之逻辑回归

逻辑回归(Logistic Regression),简称LR。它的特点是能够是我们的特征输入集合转化为0和1这两类的概率。一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大。如果非要应用进入,可以使用逻辑回归。了解过线性回归之后再来看逻辑回归可以更好的理解。

优点:计算代价不高,易于理解和实现

缺点:容易欠拟合,分类精度不高

适用数据:数值型和标称型

逻辑回归

对于回归问题后面会介绍,Logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测。g(z)可以将连续值映射到0和1上。Logistic回归用来分类0/1问题,也就是预测结果属于0或者1的二值分类问题

映射函数为:

映射出来的效果如下如:

传智播客 回归问题 学习笔记_第4张图片

 

sklearn.linear_model.LogisticRegression

逻辑回归类

class sklearn.linear_model.LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
  """
  :param C: float,默认值:1.0

  :param penalty: 特征选择的方式

  :param tol: 公差停止标准
  """

 

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression
LR = LogisticRegression(C=1.0, penalty='l1', tol=0.01)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
LR.fit(X_train,y_train)
LR.predict(X_test)
LR.score(X_test,y_test)
0.96464646464646464
# c=100.0
0.96801346801346799

传智播客 回归问题 学习笔记_第5张图片

属性

coef_

决策功能的特征系数

Cs_

数组C,即用于交叉验证的正则化参数值的倒数

特点分析

线性分类器可以说是最为基本和常用的机器学习模型。尽管其受限于数据特征与分类目标之间的线性假设,我们仍然可以在科学研究与工程实践中把线性分类器的表现性能作为基准。

逻辑回归算法案例分析

良/恶性乳腺癌肿瘤预测

原始数据的下载地址为:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/

数据预处理

import pandas as pd
import numpy as np

# 根据官方数据构建类别
column_names = ['Sample code number','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class'],

data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/',names = column_names)

# 将?替换成标准缺失值表示
data = data.replace(to_replace='?',value = np.nan)

# 丢弃带有缺失值的数据(只要一个维度有缺失)
data = data.dropna(how='any')

data.shape

处理的缺失值后的样本共有683条,特征包括细胞厚度、细胞大小、形状等九个维度

准备训练测试数据

from sklearn.cross_validation import train_test_split

X_train,X_test,y_train,y_test = train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=42)

# 查看训练和测试样本的数量和类别分布
y_train.value_counts()

y_test.value_counts()

使用逻辑回归进行良/恶性肿瘤预测任务

from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression


# 标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导
ss = StandardScaler()

X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)

# 初始化 LogisticRegression

lr = LogisticRegression(C=1.0, penalty='l1', tol=0.01)

# 跳用LogisticRegression中的fit函数/模块来训练模型参数
lr.fit(X_train,y_train)

lr_y_predict = lr.predict(X_test)

性能分析

from sklearn.metrics import classification_report

# 利用逻辑斯蒂回归自带的评分函数score获得模型在测试集上的准确定结果
print '精确率为:',lr.score(X_test,y_test)

print classification_report(y_test,lr_y_predict,target_names = ['Benign','Maligant'])

回归算法之线性回归

线性回归的定义是:目标值预期是输入变量的线性组合。线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。

优点:结果易于理解,计算不复杂

缺点:对非线性的数据拟合不好

适用数据类型:数值型和标称型

对于单变量线性回归,例如:前面房价例子中房子的大小预测房子的价格。f(x) = w1*x+w0,这样通过主要参数w1就可以得出预测的值。

通用公式为:

传智播客 回归问题 学习笔记_第6张图片

传智播客 回归问题 学习笔记_第7张图片

那么对于多变量回归,例如:瓜的好坏程度 f(x) = w0+0.2色泽+0.5根蒂+0.3*敲声,得出的值来判断一个瓜的好与不好的程度。

通用公式为:

线性模型中的向量W值,客观的表达了各属性在预测中的重要性,因此线性模型有很好的解释性。对于这种“多特征预测”也就是(多元线性回归),那么线性回归就是在这个基础上得到这些W的值,然后以这些值来建立模型,预测测试数据。简单的来说就是学得一个线性模型以尽可能准确的预测实值输出标记。

那么如果对于多变量线性回归来说我们可以通过向量的方式来表示W值与特征X值之间的关系:

传智播客 回归问题 学习笔记_第8张图片

两向量相乘,结果为一个整数是估计值,其中所有特征集合的第一个特征值x_0x​0​​=1,那么我们可以通过通用的向量公式来表示线性模型:

一个列向量的转置与特征的乘积,得出我们预测的结果,但是显然我们这个模型得到的结果可定会有误差,如下图所示:

单变量

传智播客 回归问题 学习笔记_第9张图片

 

多变量

传智播客 回归问题 学习笔记_第10张图片

 

损失函数

损失函数是一个贯穿整个机器学习重要的一个概念,大部分机器学习算法都会有误差,我们得通过显性的公式来描述这个误差,并且将这个误差优化到最小值。

对于线性回归模型,将模型与数据点之间的距离差之和做为衡量匹配好坏的标准,误差越小,匹配程度越大。我们要找的模型就是需要将f(x)和我们的真实值之间最相似的状态。于是我们就有了误差公式,模型与数据差的平方和最小:

上面公式定义了所有的误差和,那么现在需要使这个值最小?那么有两种方法,一种使用梯度下降算法另一种使正规方程解法(只适用于简单的线性回归)

传智播客 回归问题 学习笔记_第11张图片

梯度下降算法

上面误差公式是一个通式,我们取两个单个变量来求最小值,误差和可以表示为:

传智播客 回归问题 学习笔记_第12张图片

 

传智播客 回归问题 学习笔记_第13张图片

传智播客 回归问题 学习笔记_第14张图片

传智播客 回归问题 学习笔记_第15张图片

传智播客 回归问题 学习笔记_第16张图片

传智播客 回归问题 学习笔记_第17张图片

LinearRegression

sklearn.linear_model.LinearRegression

class LinearRegression(fit_intercept = True,normalize = False,copy_X = True,n_jobs = 1)
  """
  :param normalize:如果设置为True时,数据进行标准化。请在使用normalize = False的估计器调时用fit之前使用preprocessing.StandardScaler

  :param copy_X:boolean,可选,默认为True,如果为True,则X将被复制

  :param n_jobs:int,可选,默认1。用于计算的CPU核数
  """

实例代码:

from sklearn.linear_model import LinearRegression
reg = LinearRegression()

方法

fit(X,y,sample_weight = None)

使用X作为训练数据拟合模型,y作为X的类别值。X,y为数组或者矩阵

reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

predict(X)

预测提供的数据对应的结果

reg.predict([[3,3]])

array([ 3.])

属性

coef_

表示回归系数w=(w1,w2....)

reg.coef_

array([ 0.5,  0.5])

intercept_ 表示w0

加入交叉验证

前面我们已经提到了模型的交叉验证,那么我们这个自己去建立数据集,然后通过线性回归的交叉验证得到模型。由于sklearn中另外两种回归岭回归、lasso回归都本省提供了回归CV方法,比如linear_model.Lasso,交叉验证linear_model.LassoCV;linear_model.Ridge,交叉验证linear_model.RidgeCV。所以我们需要通过前面的cross_validation提供的方法进行k-折交叉验证。

from sklearn.datasets.samples_generator import make_regression
from sklearn.model_selection import cross_val_score
from sklearn import linear_model
import matplotlib.pyplot as plt

lr = linear_model.LinearRegression()
X, y = make_regression(n_samples=200, n_features=5000, random_state=0)
result = cross_val_score(lr, X, y)
print result

线性回归案例分析

波士顿房价预测

使用scikit-learn中内置的回归模型对“美国波士顿房价”数据进行预测。对于一些比赛数据,可以从kaggle官网上获取,网址:https://www.kaggle.com/datasets

1.美国波士顿地区房价数据描述

from sklearn.datasets import load_boston

boston = load_boston()

print boston.DESCR

2.波士顿地区房价数据分割

from sklearn.cross_validation import train_test_split
import numpy as np
X = boston.data
y = boston.target

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=33,test_size = 0.25)

3.训练与测试数据标准化处理

from sklearn.preprocessing import StandardScaler
ss_X = StandardScaler()
ss_y = StandardScaler()

X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
y_train = ss_X.fit_transform(y_train)
X_train = ss_X.transform(y_test)

4.使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train,y_train)
lr_y_predict = lr.predict(X_test)

from sklearn.linear_model import SGDRegressor
sgdr = SGDRegressor()
sgdr.fit(X_train,y_train)
sgdr_y_predict = sgdr.predict(X_test)

5.性能评测

对于不同的类别预测,我们不能苛刻的要求回归预测的数值结果要严格的与真实值相同。一般情况下,我们希望衡量预测值与真实值之间的差距。因此,可以测评函数进行评价。其中最为直观的评价指标均方误差(Mean Squared Error)MSE,因为这也是线性回归模型所要优化的目标。

MSE的计算方法如式:

使用MSE评价机制对两种模型的回归性能作出评价

from sklearn.metrics import mean_squared_error

print '线性回归模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(lr_y_predict))
print '梯度下降模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(sgdr_y_predict))

通过这一比较发现,使用梯度下降估计参数的方法在性能表现上不及使用解析方法的LinearRegression,但是如果面对训练数据规模十分庞大的任务,随即梯度法不论是在分类还是回归问题上都表现的十分高效,可以在不损失过多性能的前提下,节省大量计算时间。根据Scikit-learn光网的建议,如果数据规模超过10万,推荐使用随机梯度法估计参数模型。

注意:线性回归器是最为简单、易用的回归模型。正式因为其对特征与回归目标之间的线性假设,从某种程度上说也局限了其应用范围。特别是,现实生活中的许多实例数据的各种特征与回归目标之间,绝大多数不能保证严格的线性关系。尽管如此,在不清楚特征之间关系的前提下,我们仍然可以使用线性回归模型作为大多数数据分析的基线系统。

完整代码如下:

from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
from sklearn.cross_validation import train_test_split
from sklearn.metrics import mean_squared_error,classification_report
from sklearn.cluster import KMeans


def linearmodel():
    """
    线性回归对波士顿数据集处理
    :return: None
    """

    # 1、加载数据集

    ld = load_boston()

    x_train,x_test,y_train,y_test = train_test_split(ld.data,ld.target,test_size=0.25)

    # 2、标准化处理

    # 特征值处理
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)


    # 目标值进行处理

    std_y  = StandardScaler()
    y_train = std_y.fit_transform(y_train)
    y_test = std_y.transform(y_test)

    # 3、估计器流程

    # LinearRegression
    lr = LinearRegression()

    lr.fit(x_train,y_train)

    # print(lr.coef_)

    y_lr_predict = lr.predict(x_test)

    y_lr_predict = std_y.inverse_transform(y_lr_predict)

    print("Lr预测值:",y_lr_predict)


    # SGDRegressor
    sgd = SGDRegressor()

    sgd.fit(x_train,y_train)

    # print(sgd.coef_)

    y_sgd_predict = sgd.predict(x_test)

    y_sgd_predict = std_y.inverse_transform(y_sgd_predict)

    print("SGD预测值:",y_sgd_predict)

    # 带有正则化的岭回归

    rd = Ridge(alpha=0.01)

    rd.fit(x_train,y_train)

    y_rd_predict = rd.predict(x_test)

    y_rd_predict = std_y.inverse_transform(y_rd_predict)

    print(rd.coef_)

    # 两种模型评估结果

    print("lr的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))

    print("SGD的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))

    print("Ridge的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))

    return None

欠拟合与过拟合

机器学习中的泛化,泛化即是,模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现。在机器学习领域中,当我们讨论一个机器学习模型学习和泛化的好坏时,我们通常使用术语:过拟合和欠拟合。我们知道模型训练和测试的时候有两套数据,训练集和测试集。在对训练数据进行拟合时,需要照顾到每个点,而其中有一些噪点,当某个模型过度的学习训练数据中的细节和噪音,以至于模型在新的数据上表现很差,这样的话模型容易复杂,拟合程度较高,造成过拟合。而相反如果值描绘了一部分数据那么模型复杂度过于简单,欠拟合指的是模型在训练和预测时表现都不好的情况,称为欠拟合。

我们来看一下线性回归中拟合的几种情况图示:

传智播客 回归问题 学习笔记_第18张图片

 

 

传智播客 回归问题 学习笔记_第19张图片

 

传智播客 回归问题 学习笔记_第20张图片

还有在逻辑回归分类中的拟合情况:

传智播客 回归问题 学习笔记_第21张图片

传智播客 回归问题 学习笔记_第22张图片

传智播客 回归问题 学习笔记_第23张图片

传智播客 回归问题 学习笔记_第24张图片

传智播客 回归问题 学习笔记_第25张图片

 

传智播客 回归问题 学习笔记_第26张图片

传智播客 回归问题 学习笔记_第27张图片

经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的。简单的认为有这些特征的都是天鹅。因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅。

传智播客 回归问题 学习笔记_第28张图片

机器通过这些图片来学习天鹅的特征,经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的弯曲的,天鹅的脖子是长长的有点曲度,天鹅的整个体型像一个"2"且略大于鸭子。这时候机器已经基本能区别天鹅和其他动物了。然后,很不巧已有的天鹅图片全是白天鹅的,于是机器经过学习后,会认为天鹅的羽毛都是白的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。

解决过拟合的方法

在线性回归中,对于特征集过小的情况,容易造成欠拟合(underfitting),对于特征集过大的情况,容易造成过拟合(overfitting)。针对这两种情况有了更好的解决办法

欠拟合

欠拟合指的是模型在训练和预测时表现都不好的情况,欠拟合通常不被讨论,因为给定一个评估模型表现的指标的情况下,欠拟合很容易被发现。矫正方法是继续学习并且试着更换机器学习算法。

过拟合

对于过拟合,特征集合数目过多,我们需要做的是尽量不让回归系数数量变多,对拟合(损失函数)加以限制。

(1)当然解决过拟合的问题可以减少特征数,显然这只是权宜之计,因为特征意味着信息,放弃特征也就等同于丢弃信息,要知道,特征的获取往往也是艰苦卓绝的。

(2)引入了 正则化 概念。

传智播客 回归问题 学习笔记_第29张图片

过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)

欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

传智播客 回归问题 学习笔记_第30张图片

传智播客 回归问题 学习笔记_第31张图片

传智播客 回归问题 学习笔记_第32张图片

 

回归算法之岭回归

具有L2正则化的线性最小二乘法。岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。当数据集中存在共线性的时候,岭回归就会有用。

sklearn.linear_model.Ridge

class sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_state=None)**
  """
  :param alpha:float类型,正规化的程度
  """
from sklearn.linear_model import Ridge
clf = Ridge(alpha=1.0)
clf.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1]))

方法

score(X, y, sample_weight=None)

clf.score()

属性

coef_

clf.coef_
array([ 0.34545455,  0.34545455])

intercept_

clf.intercept_
0.13636...

岭回归案例分析



def linearmodel():
    """
    线性回归对波士顿数据集处理
    :return: None
    """

    # 1、加载数据集

    ld = load_boston()

    x_train,x_test,y_train,y_test = train_test_split(ld.data,ld.target,test_size=0.25)

    # 2、标准化处理

    # 特征值处理
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)


    # 目标值进行处理

    std_y  = StandardScaler()
    y_train = std_y.fit_transform(y_train)
    y_test = std_y.transform(y_test)

    # 3、估计器流程

    # LinearRegression
    lr = LinearRegression()

    lr.fit(x_train,y_train)

    # print(lr.coef_)

    y_lr_predict = lr.predict(x_test)

    y_lr_predict = std_y.inverse_transform(y_lr_predict)

    print("Lr预测值:",y_lr_predict)


    # SGDRegressor
    sgd = SGDRegressor()

    sgd.fit(x_train,y_train)

    # print(sgd.coef_)

    y_sgd_predict = sgd.predict(x_test)

    y_sgd_predict = std_y.inverse_transform(y_sgd_predict)

    print("SGD预测值:",y_sgd_predict)

    # 带有正则化的岭回归

    rd = Ridge(alpha=0.01)

    rd.fit(x_train,y_train)

    y_rd_predict = rd.predict(x_test)

    y_rd_predict = std_y.inverse_transform(y_rd_predict)

    print(rd.coef_)

    # 两种模型评估结果

    print("lr的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))

    print("SGD的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))

    print("Ridge的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))

    return None
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor,  Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
from sklearn.externals import joblib
import pandas as pd
import numpy as np

def mylinear():
    """
    线性回归直接预测房子价格
    :return: None
    """
    # 获取数据
    lb = load_boston()

    # 分割数据集到训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train, y_test)

    # 进行标准化处理(?) 目标值处理?
    # 特征值和目标值是都必须进行标准化处理, 实例化两个标准化API
    std_x = StandardScaler()

    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    # 目标值
    std_y = StandardScaler()

    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    # y_train = std_y.fit_transform(y_train)

    # y_test = std_y.transform(y_test)
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # 预测房价结果
    model = joblib.load("./tmp/test.pkl")

    y_predict = std_y.inverse_transform(model.predict(x_test))

    print("保存的模型预测的结果:", y_predict)

    # estimator预测
    # 正规方程求解方式预测结果
    lr = LinearRegression()

    lr.fit(x_train, y_train)

    print(10*"=")
    print(lr.coef_)

    # 保存训练好的模型
    # joblib.dump(lr, "./tmp/test.pkl")

    # # 预测测试集的房子价格
    y_lr_predict = std_y.inverse_transform(lr.predict(x_test))

    print("正规方程测试集里面每个房子的预测价格:", y_lr_predict)

    print("正规方程的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))

    # 梯度下降去进行房价预测
    sgd = SGDRegressor()

    sgd.fit(x_train, y_train)

    print(sgd.coef_)

    # 预测测试集的房子价格
    y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))

    print("梯度下降测试集里面每个房子的预测价格:", y_sgd_predict)

    print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))

    # 岭回归去进行房价预测
    rd = Ridge(alpha=1.0)

    rd.fit(x_train, y_train)

    print(rd.coef_)

    # 预测测试集的房子价格
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))

    print("梯度下降测试集里面每个房子的预测价格:", y_rd_predict)

    print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))

    return None


def logistic():
    """
    逻辑回归做二分类进行癌症预测(根据细胞的属性特征)
    :return: NOne
    """
    # 构造列标签名字
    column = ['Sample code number','Clump Thickness', 'Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion', 'Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']

    # 读取数据
    data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column)

    print(data)

    # 缺失值进行处理
    data = data.replace(to_replace='?', value=np.nan)

    data = data.dropna()

    # 进行数据的分割
    x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)

    # 进行标准化处理
    std = StandardScaler()

    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 逻辑回归预测
    lg = LogisticRegression(C=1.0)

    lg.fit(x_train, y_train)

    print(lg.coef_)

    y_predict = lg.predict(x_test)

    print("准确率:", lg.score(x_test, y_test))

    print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))

    return None


if __name__ == "__main__":
    mylinear()

LinearRegressionSGDRegressor

sklearn.linear_model.LinearRegression ()
普通最小二乘线性回归
coef _ :回归系数
sklearn.linear_model.SGDRegressor ( )
通过使用 SGD 最小化线性模型
coef _ :回归系数

波士顿房价数据案例分析流程

1、波士顿地区房价数据获取

2波士顿地区房价数据分割

3训练与测试数据标准化处理

4使用最简单的线性回归模型LinearRegression

梯度下降估计SGDRegressor对房价进行预测

回归性能评估

传智播客 回归问题 学习笔记_第33张图片

sklearn回归评估API

sklearn.metrics.mean_squared_error

mean_squared_error ( y_true y_pred )
均方误差回归损失
y_true : 真实值
y_pred : 预测值
return: 浮点数结果

注:真实值,预测值为标准化之前的值

传智播客 回归问题 学习笔记_第34张图片

传智播客 回归问题 学习笔记_第35张图片

1LinearRegressionSGDRegressor评估

2、特点:线性回归器是最为简单、易用的回归模型。

从某种程度上限制了使用,尽管如此,在不知道特征之

间关系的前提下,我们仍然使用线性回归器作为大多数

系统的首要选择。

小规模数据:LinearRegression(不能解决拟合问题)以及其它

大规模数据:SGDRegressor

 

l2正则化

作用:可以使得W的每个元素都很小,都接近于0

优点:越小的参数说明模型越简单,越简单的模型则越不

容易产生过拟合现象

传智播客 回归问题 学习笔记_第36张图片

sklearn.linear_model.Ridge( alpha=1.0 )
具有 l2 正则化的线性最小二乘法
alpha: 正则化力度
coef _: 回归系数

 

传智播客 回归问题 学习笔记_第37张图片

观察正则化程度的变化,对结果的影响?

传智播客 回归问题 学习笔记_第38张图片

传智播客 回归问题 学习笔记_第39张图片

传智播客 回归问题 学习笔记_第40张图片

传智播客 回归问题 学习笔记_第41张图片

sklearn.linear_model.LogisticRegression ( penalty=‘l2’, C = 1.0 )
Logistic 回归分类器
coef _ :回归系数

 

你可能感兴趣的:(Python,数学与实验数据处理)