ap 是什么表,ap 是什么岗位

  

  数据科学家经常被复杂的机器学习技术所吸引。使用一些深度神经网络(DNN)来压缩1%的额外精度,并在此过程中启动一个GPU实例,这是非常令人满意的。但是,这些技术通常会让你的想法落在计算机上,让我们对模型的工作原理知之甚少。所以,这篇文章想回到基础。   

  

     

  

  在这篇文章中,我希望教你一些关于特征工程的知识,以及如何用它来建模非线性决策边界。我们将讨论两种技术的优缺点:将给出用于拟合这些模型并可视化其决策边界的逻辑回归(具有特征工程)和NN分类器. Python代码。您也可以在上找到完整的项目。最后,我希望您能够理解为什么特征工程可能是其他非线性建模技术的更好替代方案。   

  

  什么是特征工程?无论何时从原始数据创建要素或将现有要素添加到数据集中,都是在执行要素工程。这通常是使用特定领域的领域知识来完成的。例如,假设我们想要预测一个人从手术中恢复需要的时间。从之前的手术中,我们已经捕捉到了患者的恢复时间、身高和体重。根据这些数据,我们还可以计算出身体质量指数=每个病人的身高/体重。通过计算身体质量指数并将其包含在数据集中,我们正在进行特征工程。   

  

  为什么说进行特征工程对我们来说是强大的?因为它允许我们把非线性问题重新表述成线性问题。为了说明这一点,假设恢复时间与身高和体重具有以下关系:   

  

  Y= (身高)2(体重)(身高/体重)噪音   

  

  从第三项可以看出,y与身高体重之间并不存在线性关系。这意味着我们可能不会期望线性模型(例如线性回归)在估计系数方面做得很好。你可以尝试使用非线性模型(例如DNN),或者你可以通过做一些特征工程来帮助我们的模型。如果我们决定将身体质量指数作为一个函数,则关系变为:   

  

  Y= (身高)2(体重)(身体质量指数)噪音   

  

  y现在可以建模为3个变量的线性关系。因此,我们期望线性回归在估计系数方面做得更好。稍后,我们将看到同样的想法适用于分类问题。   

  

  为什么不让计算机做特征工程本质上是一个内核技能,因为我们是把特征映射到一个更高的平面。虽然使用了内核技术,但通常很少涉及思想。把核函数看成一个超参数,可以用蛮力寻找最佳函数——尝试各种函数变化的负载。使用正确的核函数,您可以对非线性关系进行建模。给定适当数量的隐藏层/节点,DNN也将自动构造特征的非线性函数。那么,如果这些方法可以对非线性关系建模,为什么还要麻烦特征工程呢?   

  

  我们在上面解释了即使我们使用线性模型,特征工程如何使我们能够捕捉数据中的非线性关系。这意味着,根据问题,我们可以获得与非线性模型相似的性能。在本文的后面部分,我们将详细介绍一个例子。此外,使用特征工程还有其他好处,这使得这项技术值得一试。   

  

     

  

  首先,您将对模型的工作原理有更好的理解。这是因为您确切地知道模型使用什么信息来进行预测。此外,通过直接查看特征系数,可以很容易地解释逻辑回归等模型。第一个原因是模型更容易解释。如果你在这个行业工作,这一点尤其重要。你的同事更有可能接触到更简单的模型。第三个原因是你的模型不适合训练数据。通过强制不同的超级参数,很容易最终对数据中的噪声进行建模。相比之下,有了深思熟虑的特性,你的模型将是直观的,并可能模拟真实的潜在趋势。   

  

  让我们深入研究数据集的一个实际例子。为了让内容尽可能清晰,会使用人工生成的数据集。为了避免这个例子太无聊,我们将围绕它创建一个叙述。所以,假设你的HR部门让你创建一个可以预测你会不会升职的模型。该模型应考虑员工的年龄和绩效得分。   

  

  我们在下面的代码中为2000名假设的雇员创建特性。雇员的年龄可以在18岁到60岁之间。绩效分数可以在-10到10之间(最高分是10)。这两个特性都是混洗的,所以它们之间没有相关性。然后,我们使用以下年龄(A)和表现(P)的函数来生成目标变量:   

  

  (a,p)=100(a)200(p)500(a/p)-10000 500(噪声)   

  

  当(a,p)0时,员工将获得晋升;当(a,p)为0时,员工不会被提升。我们可以看到,上述函数中包含了术语a/p。这意味着决策界限将不是年龄和表现的线性函数。而且还有随机噪声,所以数据不能完全分离。换句话说,模型不可能100%准确。   

  

  import numpy as NP import pandas as PD n_points=2000 age=NP . round(NP . Lin space(18,60,n _ points),2)#员工年龄NP . random . shuffle(age)performance=NP . Lin spa   

ce(-10,10,n_points) #performance score of employee np.random.shuffle(performance) noise = np.random.randn(n_points) g = (100*age) +200*(performance) + 500*age/performance -10000 + 500*noise y = <1 if y>=0 else 0 for y in g> data = pd.DataFrame(data={'age':age,'performance':performance,'y':y})如果上面的步骤有点混乱,请不要担心。通过使用以下代码可视化数据集,我们可以使事情更清晰。在这里,我们创建了数据的散点图,结果如图1所示。只有两个功能,可以很容易地准确了解正在发生的事情。在y轴上,我们拥有员工的绩效得分,在x轴上,我们拥有员工的年龄。晋升员工的分数为红色,未晋升员工的分数为蓝色。最后,在2000名员工中,有459名(占23%)获得了晋升。对于不同的随机样本,此比率将略有变化。

  

import matplotlib.pyplot as plt %matplotlib inline plt.subplots(nrows=1, ncols=1,figsize=(15,10)) plt.scatter('age','performance',c='#ff2121',data=data) plt.scatter('age','performance',c='#2176ff',data=data) plt.ylabel("Performance Score",size=20) plt.xlabel('Age',size=20) plt.yticks(size=12) plt.xticks(size=12) plt.legend(<'Promoted','Not Promoted'>,loc =2,prop={"size":20})图1:促销数据的散点图

  

尽管生成了这些数据,但我们仍然可以对图进行实际说明。在图1中,我们可以看到3个不同的雇员组。第一个是绩效得分低于0的组。由于绩效不佳,这些员工中的大多数没有得到晋升,我们也可以期望其中的一些人被解雇。我们可以期望得分高于0的员工获得升职或接受其他职位。得分特别高的员工倾向于离职。这可能是因为它们的需求量很大,并且在其他地方收到了更好的报价。但是,随着雇主的年龄增长,他们需要更高的绩效分数才能离职。这可能是因为年长的员工更愿意担任目前的职位。

  

无论哪种叙述,很明显决策边界不是线性的。换句话说,不可能画出一条直线来很好地区分被提升和未被提升的群体。结果,我们不会期望线性模型做得很好。让我们通过仅使用年龄和绩效这两个特征来拟合逻辑回归模型来证明这一点。

  

逻辑回归在下面的代码中,我们将2000名员工分为训练集(70%)和测试集(30%)。我们使用训练集来训练逻辑回归模型。然后,使用该模型,对测试集进行预测。测试仪的准确性为82%。这看起来似乎还不错,但是我们应该考虑不到23%的员工获得了晋升。因此,如果我们只是猜测没有一个员工会获得升职,那么我们应该期望其准确性约为77%。

  

from sklearn.model_selection import train_test_split import sklearn.metrics as metric import statsmodels.api as sm x = data<<'age','performance'>> x = sm.add_constant(x) y = data<'y'> x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3, random_state=101) model = sm.Logit(y_train,x_train).fit() #fit logistic regression model predictions = np.around(model.predict(x_test)) accuracy = metric.accuracy_score(y_test,predictions)通过使用以下代码可视化模型的决策边界,我们可以更好地了解模型的特征。在这里,我们在样本空间内生成一百万个点。然后,我们使用逻辑回归模型对所有这些点进行预测。像图1中的散点图一样,我们可以绘制每个点。每个点的颜色由模型的预测确定-如果模型预测升级,则为粉红色,否则为浅蓝色。这使我们可以很好地近似决策边界,如图2所示。然后,我们可以在这些点上绘制实际数据集。

  

n_points = 1000000 #use many point to visualise decision boundry age_db = np.linspace(18,60,n_points) np.random.shuffle(age_db) performance_db= np.linspace(-10,10,n_points) np.random.shuffle(performance_db) data_db = pd.DataFrame({'age':age_db,'performance':performance_db}) data_db = sm.add_constant(data_db) #make predictions on the decision boundry points predictions = model.predict(data_db) y_db = data_db<'y'> = y_db fig, ax = plt.subplots( nrows=1, ncols=1,figsize=(15,10)) #Plot decision boundry plt.scatter('age','performance',c='#ffbdbd',s=1,data=data_db) plt.scatter('age','performance',c='#b0c4ff',s=1,data=data_db) #Plot employee data points plt.scatter('age','performance',c='#ff2121',data=data) plt.scatter('age','performance',c='#2176ff',data=data) plt.ylabel("Performance Score",size=20) plt.xlabel('Age',size=20) plt.yticks(size=12) plt.xticks(size=12)查看决策边界,我们可以看到模型做得很糟糕。它预测有晋升的员工中大约有一半没有晋升。然后,对于大多数获得晋升的员工,它预测他们没有获得晋升。注意,决策边界是一条直线。这强调逻辑回归是线性分类器。换句话说,模型只能构造一个决策边界,该边界是您提供的要素的线性函数。在这一点上,我们可能很想尝试其他模型,但让我们看看是否可以使用特征工程来提高性能。

  

图2:Logistic回归模型的决策边界

  


  


  

用于特征工程的逻辑回归首先,如下面的代码所示,我们添加了其他特征(即年龄与性能的比率)。从那时起,我们将遵循与先前模型相同的过程。火车测试拆分与我们为" random_state"使用相同的值相同。最终,该模型实现了98%的准确度,这是一个重大改进。

  

该模型仍然只需要员工的年龄和绩效即可做出预测。这是因为附加功能是年龄和性能的函数。这使我们能够像以前一样可视化决策边界。那就是通过在样本空间中每个年龄表现点使用模型的预测。我们可以看到,在图3中,通过添加附加特征,逻辑回归模型能够对非线性决策边界进行建模。从技术上讲,这是年龄和性能的非线性函数,但仍是所有3个特征的线性函数。

  

图3:具有特征工程的Logistic回归模型的决策边界

  

使用逻辑回归的另一个好处是该模型是可以解释的。这意味着该模型可以用人类的术语来解释。换句话说,我们可以直接查看模型系数以了解其工作原理。我们可以在表1中看到模型特征的系数以及它们的p值。我们不会详细介绍,但是系数允许您根据获得的几率的变化来解释特征的变化。促销。如果某个特征的系数为正,则该特征值的增加会导致获得晋升的几率增加。

  

表1:Logistic回归模型摘要

  

从表1可以看出,随着年龄的增长,晋升的可能性也会增加。另一方面,对于性能而言,这种关系并不明确。绩效的提高也会降低年龄/绩效比率。这意味着绩效提高的效果取决于员工的年龄。这非常直观,因为它与我们在散点图中看到的一致。在这种情况下,可能没有必要使用系数来以此方式解释模型。仅可视化决策边界就足够了,但是随着功能数量的增加,执行此操作变得更加困难。在这种情况下,模型系数是了解模型工作原理的绝佳工具。

  

同样,p值可以帮助我们理解模型。由于系数是统计估计值,因此它们周围存在一些不确定性。低p值使我们可以确定我们的系数不同于0。换句话说,我们可以确定系数为正或负。这很重要,因为如果我们不确定系数的符号,就很难用几率的变化来解释特征的变化。从表1可以看出,所有系数在统计上都是显着的。这并不奇怪,因为我们使用功能的功能生成了数据。

  

总的来说,当我们生成数据时,上面的分析非常简单。因为我们知道使用了什么函数来生成数据,所以很明显,附加特征将提高模型的准确性。实际上,这不是那么简单。如果您对数据没有很好的了解,则可能需要与人事部门的人员交谈。他们也许能够将过去所看到的任何趋势通知您。否则,通过使用各种图表和汇总统计数据探索该数据,您可以了解哪些特征可能很重要。但是,假设我们不想做所有这些艰苦的工作。

  

神经网络为了进行比较,让我们使用非线性模型。在下面的代码中,我们使用Keras拟合神经网络。我们仅使用年龄和性能作为特征,因此NN的输入层的尺寸为2。有2个隐藏层,分别具有20和15个节点。两个隐藏层均具有relu激活功能,输出层具有S型激活功能。要训练模型,我们使用10和100个纪元的批量。训练集大小为1400,这使我们有14000步。最后,该模型在测试集上达到了98%的精度。这与逻辑回归模型的准确性相同,但是我们不必进行任何特征工程。

  

查看图4中的NN决策边界,我们可以看到为什么将其视为非线性分类算法。即使我们只给出了模型的年龄和性能,它仍然能够构造非线性决策边界。因此,该模型在一定程度上为我们做了艰苦的工作。您可以说模型的隐藏层已自动完成要素工程。然后,考虑到该模型具有很高的准确性,并且我们需要较少的工作,为什么还要考虑逻辑回归呢?

  

图4:神经网络的决策边界

  

NN的缺点是只能解释。这意味着,与逻辑回归不同,我们无法直接查看模型的参数以查看其工作原理。我们可以使用其他方法,但是最终,要理解NN的工作原理更加困难。向非技术人员解释这一点更加困难。这使得逻辑回归模型在行业环境中的价值更大。

  

工业界和学术界都存在许多问题,而且大多数问题都比本文中给出的示例更为复杂。所提出的方法显然不是所有这些问题的最佳解决方案。例如,如果您要进行图像识别,那么Logistic回归将无济于事。对于更简单的问题,通常只需要逻辑回归和对数据的充分理解。

  


相关文章