本文为 AI 研习社编译的技术博客,原标题 :
Linear Classifier
作者 | Thomas Pernet
翻译 | 邓普斯•杰弗、涂世文、Disillusion
校对 | 邓普斯•杰弗 审核| 酱番梨 整理 | 菠萝妹
原文链接:
https://medium.com/@thomaspernet/linear-classifier-aa3ccec96efa
什么是线性分类器?
在有监督学习中,最主要的两种学习任务是 回归(regression) 和 分类(classification),而其中 线性回归 和 线性分类 最为常见。线性回归是预测某一个具体的值,而线性分类是数据所属类别进行预测。这里,我们主要关注线性分类问题。
一般来说,几乎 80% 机器学习任务可以看作是某种分类问题。分类,即给定一个输入的集合,分类器致力于预测每一个类别的概率。类别标记(也被称为 应变量或依赖变量)是一个离散的值,表示某个类别。如果数据中的 Label 只有两个类别,那么就属于二分类问题,相应的分类器被称为 二分类器。
多分类器解决 Label 种类多于两种类别的分类问题。
譬如,预测顾客是否会进行二次购买便是一个典型的二分类问题。而识别图片中出现动物则是属于多分类问题,因为实际情况中动物有很多种。
本文的理论部分主要关注于二分类问题。未来我们也会推出关于多分类的内容,敬请期待!
二分类器是如何工作的?
在前面的教程中你已经了解到函数由两类变量组成,一个应变量和一组特征(自变量)。在线性回归中,应变量是一个没有范围的实数。主要目标是通过最小化均方误差来预测其值。
对于二分类任务,标签可以有两个可能的整数值。在大多数情况下,要么是[0,1]要么是[1,2]。
例如,如果目标是预测客户是否会购买产品。标签可为如下:Y = 1(客户购买了产品)
Y = 0 (客户没有购买产品)
该模型使用特征X将每个客户分类到他最有可能的所属类别,即是潜在购买者,或否。
成功的概率用逻辑回归计算。该算法将根据特征X计算出一个概率,并在该概率大于50%时预测成功。概率的算式如下:
θ是权重的集合,x是特征,b是偏差
该函数可进一步分为两部分:线性模型
逻辑函数
线性模型
你已经熟悉了计算权重的方法。权重计算使用点积:θ^ Tx + b
Y是所有特征x_i的线性函数。如果模型没有特征,则预测结果为偏差b。
权值表示特征x_i与标签y之间相关性的方向。正相关增加了正类的概率,而负相关使概率更接近于0(即负类)。
线性模型只返回实数,与区间[0,1]的概率测度不一致。因此需要逻辑函数将线性模型输出转换为概率。
逻辑函数
逻辑函数,亦称sigmoid函数,为s形,且输出总是在0和1之间。
将线性回归的输出代入sigmoid函数是很容易的。它产生一个概率在0和1之间的新数字。
分类器可以将概率转化为类0到0.49之间的值分到0类
从0.5到1之间的值分到1类
如何度量显性分类器的性能?
准确度:
分类器的整体性能是用准确度量来衡量的。准确度收集所有正确值除以观测总数。例如,精度值为80%意味着模型在80%的情况下是正确的。
您可以注意到这个度量的一个缺点,特别是对于不平衡样本分类情况。当每组的观测次数不相等时,就会出现不平衡数据集。比如说,你试图用logistics函数来分类一个罕见的事件。假设分类器试图估计疾病后患者的死亡。在数据中,5%的病人去世了。您可以训练分类器来预测死亡人数,并使用准确度量来评估性能。如果分类器预测整个数据集的死亡为0,那么则95%的情况下是正确的。(也就是说,你的分类器可以直接判定都是不死亡,就可以实现非常高的准确度)
混淆矩阵:
评估分类器性能的更好方法是查看混淆矩阵。
想象的混乱矩阵的准确度进行比较的当前和预测的分类器分类。组成:二进制混淆矩阵法:TP: 真正:正确预测为实际正的预测值
FP:预测值错误地预测了实际的正值。也就是说,预测为正值的负值
FN:假负:预测为负的正值
TN:真负:正确预测为实际负的预测值
从混淆矩阵可以很容易地比较实际标签结果和预测标签结果。
精确度和灵敏度
混淆矩阵可以很好地洞察真阳性和假阳性。在某些情况下,是一个更简洁的度量。
精确度
精准度显示正类的精度。它衡量了正类预测的正确程度。
当分类器对所有正值进行完全分类时,最大得分为1。精确度本身并不是很有帮助,因为它忽略了负类。度量通常与召回成对出现。回忆也被称为敏感性或真阳性率。
灵敏性
灵敏度计算正确检测到的正类的比率。这个指标给出了模型识别正类的能力。
tensorflow实现线性分类器
对于本教程,我们将使用人口普查数据集。目的是使用人口普查数据集中的变量来预测收入水平。注意,收入是一个二元变量。如果收入大于50K,值为1
如果收入小于50K,则为0。
这个变量是你的类别标签
该数据集包括八个分类变量:工作场所
教育
婚姻的
职业
关系
种族
性别
国家
此外,六个连续变量:年龄
FNLWgt
教育数字
资本收益
资本损失
小时\周
通过这个例子,您将了解如何用张量流估计训练线性分类器,以及如何提高准确度指标。
我们将按以下步骤进行:
第一步:导入数据
第二步:数据转换
第三步:训练分类器
第四步:改进模型
第5步:超参数:Lasso & Ridge
开始分布介绍:
步骤1:导入数据
首先导入教程中使用的库。
导入TensorFlow as tf \ import pandas as pd
接下来,从UCI存档导入数据并定义列名称。您将使用列来命名pandas dataframe。
请注意,您将使用Pandas dataframe来训练分类器。
import pandas as pd
import tensorflow as tf
## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital',
'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
'hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
PATH_test = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"
/Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6
return f(*args, **kwds)
在线存储的数据已经在训练组和测试组之间进行了划分。
df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False)
df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)
训练数据集合包含32561组数据,测试数据集中包含16281组数据;
print(df_train.shape, df_test.shape)
print(df_train.dtypes)
(32561, 15) (16281, 15)
age int64
workclass object
fnlwgt int64
education object
education_num int64
marital object
occupation object
relationship object
race object
sex object
capital_gain int64
capital_loss int64
hours_week int64
native_country object
label object
dtype: object
TensorFlow需要一个布尔值来训练分类器。您需要将值从字符串转换为整数。标签存储为一个对象,但是,您需要将其转换为一个数值。下面的代码创建一个字典,其中包含要转换的值,并在列项上循环。请注意,您执行此操作两次,一次针对训练数据集,一次用于测试数据集;
label = {'<=50K': 0,'>50K': 1}
df_train.label = [label[item] for item in df_train.label]
label_t = {'<=50K.': 0,'>50K.': 1}
df_test.label = [label_t[item] for item in df_test.label]
训练数据中,50K以下收入24720人,以上收入7841人。测试集的比率几乎相同。有关更多信息,请参阅本教程中的方面。
print(df_train["label