机器学习04-06 Logistic Regression

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


机器学习04-06 Logistic Regression

提示:
01、预处理之标准化
02、混淆矩阵的基础知识:sklearn.preprocessing中的scale和StandardScaler
03、画出散点图和Logistic分类线(np. meshgrid 生成网格点坐标矩阵;plt.contourf绘制轮廓线或等高线 plt.scatter 绘制散点图)


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码步骤

1.数据预处理

情况说明:这些信息涉及用户ID,性别,年龄以及预估薪资。一家汽车公司刚刚推出了他们新型的豪华SUV,我们尝试预测哪些用户会购买这种全新SUV。并且在最后一列用来表示用户是否购买。我们将建立一种模型来预测用户是否购买这种SUV,该模型基于两个变量,分别是年龄和预计薪资。

### 导入库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

### 导入数据
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
Y = dataset.iloc[:,4].values

### 分割数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)

### 特征缩放 ———— 标准化
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

2.Logistic模型

代码如下(示例):

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)

3.预测

代码如下(示例):

y_pred = classifier.predict(X_test)

4.模型评估

代码如下(示例):

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

5.结果可视化

代码如下(示例):

from matplotlib.colors import ListedColormap
X_set,y_set=X_train,y_train
X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),
                   np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(),X1.max())
plt.ylim(X2.min(),X2.max())
for i,j in enumerate(np. unique(y_set)):
    plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],
                c = ListedColormap(('red', 'green'))(i), label=j)

plt. title(' LOGISTIC(Training set)')
plt. xlabel(' Age')
plt. ylabel(' Estimated Salary')
plt. legend()
plt. show()

X_set,y_set=X_test,y_test
X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),
                   np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01))

plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(),X1.max())
plt.ylim(X2.min(),X2.max())
for i,j in enumerate(np. unique(y_set)):
    plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],
                c = ListedColormap(('red', 'green'))(i), label=j)

plt. title(' LOGISTIC(Test set)')
plt. xlabel(' Age')
plt. ylabel(' Estimated Salary')
plt. legend()
plt. show()

该处使用的url网络请求的数据。

二、标准化基础知识

1.标准化的两种方法

标准化:对不同特征维度的伸缩变换,从而使得不同度量之间的特征具有可比性,同时不改变原始数据的分布。
标准化公式:(X-mean)/std ,计算时对每个属性/每列分别进行。
方法:
方法一:使用sklearn.preprocessing.scale()函数

方法二:使用sklearn.preprocessing.StandardScaler类
两种方法区别:方法一,只能是把训练集和测试集合起来, 计算出共同的mean和std, 然后 (X-mean) / std,再分成训练集和测试集。这里的mean和std的计算涉及到了测试集,是训练集和测试集共同的期望和方差;方法二:只需要处理训练集,拿训练集的数据计算出均值x_train_mean, x_train_std和方差,然后训练集的X_train和测试集的X_test都执行标准化。 这里注意:测试集的标准化是利用的训练集的均值和方差。 也就是假设训练集的期望和测试集的期望是一样的,这样只需要计算出训练集的期望之后,直接用于测试集就可以了,这里只是训练集的期望和方差,没有涉及测试集
参考链接:添加链接描述

2.标准化 VS 归一化

归一化 : 把数据变成0-1或者-1-1之间的小数,把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。
归一化公式:(x - X_min) / (X_max - X_min)
区别文字展示:归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移
区别图像展示:
举个例子看一下:
根据人的身高和体重预测人的健康指数
假设有如下原始样本数据是四维的
在这里插入图片描述
从上面两个坐标图可以看出,样本在数据值上的分布差距是不一样的,但是其几何距离是一致的。而标准化就是一种对样本数据在不同维度上进行一个伸缩变化(而不改变数据的几何距离),也就是不改变原始数据的信息(分布)。这样的好处就是在进行特征提取时,忽略掉不同特征之间的一个度量,而保留样本在各个维度上的信息(分布)。
在这里插入图片描述
归一化则会在不同维度上对数据进行不同的伸缩变化(归一区间,会改变数据的原始距离,分布,信息),使得其呈类圆形。虽然这样样本会失去原始的信息,但这防止了归一化前直接对原始数据进行梯度下降类似的优化算法时最终解被数值大的特征所主导。归一化之后,各个特征对目标函数的影响权重是一致的。这样的好处是在提高迭代求解的精度。
归一化做的是,消除了不同特征之间的数值相差很大从而导致结果不同的因素(比如某一个特征的数都是很大的一些数,另一个特征的数都是很小的数,那么如果不归一化的话,可能那个特征大的那些,稍微发生改变,就会导致结果有很大的不同,所以为了消除数相差很大的影响,对数据进行归一化,让它们都变成0-1之间的数),但是这时候,数据会失去原始的一些信息。
参考链接:添加链接描述
解释说明:区别归一化和标准化; 为什么要归一化和标准化;哪些模型需要归一化和标准化
参考链接:添加链接描述
解释说明:标准化的两种方法的python实现

三、可视化

1.np.meshgrid()理解

作用 : 用来生成网格点对应的坐标矩阵
可参考这一部分最后的参考链接

import numpy as np
import matplotlib.pyplot as plt

x = np.array([[0, 1, 2], [0, 1, 2]])
y = np.array([[0, 0, 0], [1, 1, 1]])


plt.plot(x, y,
         color='red',  # 全部点设置为红色
         marker='.',  # 点的形状为圆点
         linestyle='')  # 线型为空,也即点与点之间不用线连接

等价于下图:

a = np.array([0,1,2])

b = np.array([0,1])

A,B = np.meshgrid(a,b)

plt.plot(A,B,marker='.',  
         linestyle='')

参考链接:添加链接描述

2.plt.contourf()理解

作用:绘制等高线
参考链接:添加链接描述
代码截至countourf(),如下图所示:
在这里插入图片描述
最终结果如下图所示:
在这里插入图片描述


总结

此处只说明了标准化和可视化。混淆矩阵后面再说

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值