这些数据与葡萄牙银行机构的直接营销活动有关

2020-01-05 19:23 来源:未知

0.缺乏数据(LackData)

对于分类问题或预估问题来说,常常缺乏准确标注的案例。

例如:

欺诈侦测(FraudDetection):在上百万的交易中,可能只有屈指可数的欺诈交易,还有很多的欺诈交易没有被正确标注出来,这就需要在建模前花费大量人力来修正。

信用评分(CreditScoring):需要对潜在的高风险客户进行长期跟踪(比如两年),从而积累足够的评分样本。

1.太关注训练(FocusonTraining)

IDMer:就象体育训练中越来越注重实战训练,因为单纯的封闭式训练常常会训练时状态神勇,比赛时一塌糊涂。

实际上,只有样本外数据上的模型评分结果才真正有用!(否则的话,直接用参照表好了!)

癌症检测(Cancerdetection):MDAnderson的医生和研究人员(1993)使用神经网络来进行癌症检测,惊奇地发现,训练时间越长(从几天延长至数周),对训练集的性能改善非常轻微,但在测试集上的性能却明显下降。

机器学习或计算机科学研究者常常试图让模型在已知数据上表现最优,这样做的结果通常会导致过度拟合(overfit)。

永利平台娱乐 1

  解决方法:

解决这个问题的典型方法是重抽样(Re-Sampling)。重抽样技术包括:bootstrap、cross-validation、jackknife、leave-one-out…等等。

2.只依赖一项技术(RelyonOneTechnique)

IDMer:这个错误和第10种错误有相通之处,请同时参照其解决方法。没有对比也就没有所谓的好坏,辩证法的思想在此体现无遗。

“当小孩子手拿一把锤子时,整个世界看起来就是一枚钉子。”要想让工作尽善尽美,就需要一套完整的工具箱。

不要简单地信赖你用单个方法分析的结果,至少要和传统方法(比如线性回归或线性判别分析)做个比较。

研究结果:按照《神经网络》期刊的统计,在过去3年来,只有1/6的文章中做到了上述两点。也就是说,在独立于训练样本之外的测试集上进行了开集测试,并与其它广泛采用的方法进行了对比。

使用一系列好的工具和方法。(每种工具或方法可能最多带来5%~10%的改进)。

3.提错了问题(AsktheWrongQuestion)

IDMer:一般在分类算法中都会给出分类精度作为衡量模型好坏的标准,但在实际项目中我们却几乎不看这个指标。为什么?因为那不是我们关注的目标。

a)项目的目标:一定要锁定正确的目标

欺诈侦测(关注的是正例!)(Shannon实验室在国际长途电话上的分析):不要试图在一般的通话中把欺诈和非欺诈行为分类出来,重点应放在如何描述正常通话的特征,然后据此发现异常通话行为。

b)模型的目标:让计算机去做你希望它做的事

大多数研究人员会沉迷于模型的收敛性来尽量降低误差,这样让他们可以获得数学上的美感。但更应该让计算机做的事情应该是如何改善业务,而不是仅仅侧重模型计算上的精度。

4.只靠数据来说话(Listen(only)totheData)

IDMer:“让数据说话”没有错,关键是还要记得另一句话:兼听则明,偏听则暗!如果数据+工具就可以解决问题的话,还要人做什么呢?

永利平台娱乐 2

4a.投机取巧的数据:数据本身只能帮助分析人员找到什么是显著的结果,但它并不能告诉你结果是对还是错。

4b.经过设计的实验:某些实验设计中掺杂了人为的成分,这样的实验结果也常常不可信。

5.使用了未来的信息(AcceptLeaksfromtheFuture)

IDMer:看似不可能,却是实际中很容易犯的错误,特别是你面对成千上万个变量的时候。认真、仔细、有条理是数据挖掘人员的基本要求。

预报(Forecast)示例:预报芝加哥银行在某天的利率,使用神经网络建模,模型的准确率达到95%。但在模型中却使用了该天的利率作为输入变量。

金融业中的预报示例:使用3日的移动平均来预报,但却把移动平均的中点设在今天。

要仔细查看那些让结果表现得异常好的变量,这些变量有可能是不应该使用,或者不应该直接使用的。

给数据加上时间戳,避免被误用。

6.抛弃了不该忽略的案例(DiscountPeskyCases)

IDMer:到底是“宁为鸡头,不为凤尾”,还是“大隐隐于市,小隐隐于野”?不同的人生态度可以有同样精彩的人生,不同的数据也可能蕴含同样重要的价值。

异常值可能会导致错误的结果(比如价格中的小数点标错了),但也可能是问题的答案(比如臭氧洞)。所以需要仔细检查这些异常。

研究中最让激动的话语不是“啊哈!”,而是“这就有点奇怪了……”

数据中的不一致性有可能会是解决问题的线索,深挖下去也许可以解决一个大的业务问题。

在直邮营销中,在对家庭地址的合并和清洗过程中发现的数据不一致,反而可能是新的营销机会。

可视化可以帮助你分析大量的假设是否成立。

7.轻信预测(Extrapolate)

IDMer:依然是辩证法中的观点,事物都是不断发展变化的。

人们常常在经验不多的时候轻易得出一些结论。

即便发现了一些反例,人们也不太愿意放弃原先的想法。

维度咒语:在低维度上的直觉,放在高维度空间中,常常是毫无意义的。

进化论。没有正确的结论,只有越来越准确的结论。

8.试图回答所有问题(AnswerEveryInquiry)

IDMer:有点像我爬山时鼓励自己的一句话“我不知道什么时候能登上山峰,但我知道爬一步就离终点近一步。”

“不知道”是一种有意义的模型结果。

模型也许无法100%准确回答问题,但至少可以帮我们估计出现某种结果的可能性。

9.随便地进行抽样(SampleCasually)

9a降低抽样水平。例如,MD直邮公司进行响应预测分析,但发现数据集中的不响应客户占比太高(总共一百万直邮客户,其中超过99%的人未对营销做出响应)。于是建模人员做了如下抽样:把所有响应者放入样本集,然后在所有不响应者中进行系统抽样,即每隔10人抽一个放入样本集,直到样本集达到10万人。但模型居然得出如下规则:凡是居住在Ketchikan、Wrangell和WardCoveAlaska的人都会响应营销。这显然是有问题的结论。(问题就出在这种抽样方法上,因为原始数据集已经按照邮政编码排序,上面这三个地区中不响应者未能被抽取到样本集中,故此得出了这种结论)。

解决方法:“喝前摇一摇!”先打乱原始数据集中的顺序,从而保证抽样的随机性。

9b提高抽样水平。例如,在信用评分中,因为违约客户的占比一般都非常低,所以在建模时常常会人为调高违约客户的占比(比如把这些违约客户的权重提高5倍)。建模中发现,随着模型越来越复杂,判别违约客户的准确率也越来越高,但对正常客户的误判率也随之升高。(问题出在数据集的划分上。在把原始数据集划分为训练集和测试集时,原始数据集中违约客户的权重已经被提高过了)

永利平台娱乐 3

  解决方法:先进行数据集划分,然后再提高训练集中违约客户的权重。

10.太相信最佳模型(BelievetheBestModel)

IDMer:还是那句老话-“没有最好,只有更好!”

可解释性并不一定总是必要的。看起来并不完全正确或者可以解释的模型,有时也会有用。

“最佳”模型中使用的一些变量,会分散人们太多的注意力。(不可解释性有时也是一个优点)

一般来说,很多变量看起来彼此都很相似,而最佳模型的结构看上去也千差万别,无迹可循。但需注意的是,结构上相似并不意味着功能上也相似。

解决方法:把多个模型集装起来可能会带来更好更稳定的结果。

导读:

style="font-size: 14px;">分类问题是机器学习应用中的常见问题,而二分类问题是其中的典型,例如垃圾邮件的识别。本文基于UCI机器学习数据库中的银行营销数据集,从对数据集进行探索,数据预处理和特征工程,到学习模型的评估与选择,较为完整的展示了解决分类问题的大致流程。文中包含了一些常见问题的处理方式,例如缺失值的处理、非数值属性如何编码、如何使用过抽样和欠抽样的方法解决分类问题中正负样本不均衡的问题等等。

作者:llhthinker

style="font-size: 14px;">欢迎转载,请保留原文链接:

数据挖掘的总结,这10大易犯错误包括:

1. 数据集选取与问题定义

本次实验选取UCI机器学习库中的银行营销数据集(Bank Marketing Data Set: )[Moro et al., 2014]. 。这些数据与葡萄牙银行机构的直接营销活动有关。这些直接营销活动是以电话为基础的。通常来说,银行机构的客服人员至少需要联系一次客户来得知客户是否将认购银行的产品(定期存款)。因此,与该数据集对应的任务是分类任务,而分类目标是预测客户是(yes)否(no)认购定期存款(变量y)。

数据集包含四个csv文件:

1) bank-additional-full.csv: 包含所有的样例(41188个)和所有的特征输入(20个),根据时间排序(从2008年5月到2010年9月);

2) bank-additional.csv: 从1)中随机选出10%的样例(4119个);

3) bank-full.csv: 包含所有的样例(41188个)和17个特征输入,根据时间排序。(该数据集是更老的版本,特征输入较少);

4) bank.csv: 从3)中随机选出10%的样例4119个)。

提供小的数据集(bank-additional.csv和bank.csv)是为了能够快速测试一些计算代价较大的机器学习算法(例如SVM)。本次实验将选取较新的数据集,即包含20个特征量的1)和2)。

  1. 缺乏数据(Lack Data)
  2. 太关注训练(Focus on Training)
  3. 只依赖一项技术(Rely on One Technique)
  4. 提错了问题(Ask the Wrong Question)
  5. 只靠数据来说话(Listen (only) to the Data)
  6. 使用了未来的信息(Accept Leaks from the Future)
  7. 抛弃了不该忽略的案例(Discount Pesky Cases)
  8. 轻信预测(Extrapolate)
  9. 试图回答所有问题(Answer Every Inquiry)
  10. 随便地进行抽样(Sample Casually)
  11. 太相信最佳模型(Believe the Best Model)

2. 认识数据

 

2.1 数据集输入变量与输出变量

数据集的输入变量是20个特征量,分为数值变量(numeric)和分类(categorical)变量。具体描述见数据集网站。

输出变量为y,即客户是否已经认购定期存款(binary: "yes", "no")。

  1. 缺乏数据(Lack Data)

2.2 原始数据分析

首先载入数据,

永利平台娱乐 4

然后使用info()函数和describe()函数查看数据集的基本信息。

永利平台娱乐 5永利平台娱乐 6

对于分类问题或预估问题来说,常常缺乏准确标注的案例。

3. 数据预处理与特征工程

例如:
-欺诈侦测(Fraud Detection):在上百万的交易中,可能只有屈指可数的欺诈交易,还有很多的欺诈交易没有被正确标注出来,这就需要在建模前花费大量人力来修正。
-信用评分(Credit Scoring):需要对潜在的高风险客户进行长期跟踪(比如两年),从而积累足够的评分样本。

3.1 缺失值处理

从2.2节给出的数据集基本信息可以看出,数值型变量(int64和float64)没有缺失。非数值型变量可能存在unknown值。使用如下代码查看字符型变量unknown值的个数。

永利平台娱乐 7

缺失值处理通常有如下的方法:

  • 对于unknown值数量较少的变量,包括job和marital,删除这些变量是缺失值(unknown)的行;
  • 如果预计该变量对于学习模型效果影响不大,可以对unknown值赋众数,这里认为变量都对学习模型有较大影响,不采取此法;
  • 可以使用数据完整的行作为训练集,以此来预测缺失值,变量housing,loan,education和default的缺失值采取此法。由于sklearn的模型只能处理数值变量,需要先将分类变量数值化,然后进行预测。本次实验使用随机森林预测缺失值,代码如下:

    def fill_unknown(data, bin_attrs, cate_attrs, numeric_attrs):

    # fill_attrs = ['education', 'default', 'housing', 'loan']
    fill_attrs = []
    for i in bin_attrs+cate_attrs:
        if data[data[i] == 'unknown']['y'].count() < 500:
            # delete col containing unknown
            data = data[data[i] != 'unknown'] 
        else:
            fill_attrs.append(i)
    
    data = encode_cate_attrs(data, cate_attrs)
    data = encode_bin_attrs(data, bin_attrs)
    data = trans_num_attrs(data, numeric_attrs)
    data['y'] = data['y'].map({'no': 0, 'yes': 1}).astype(int)
    for i in fill_attrs:     
        test_data = data[data[i] == 'unknown']
        testX = test_data.drop(fill_attrs, axis=1)
        train_data = data[data[i] != 'unknown']        
        trainY = train_data[i]
        trainX = train_data.drop(fill_attrs, axis=1)    
        test_data[i] = train_predict_unknown(trainX, trainY, testX)
        data = pd.concat([train_data, test_data])
    
    return data
    
  1. 太关注训练(Focus on Training)
    IDMer:就象体育训练中越来越注重实战训练,因为单纯的封闭式训练常常会训练时状态神勇,比赛时一塌糊涂。

3.2 分类变量数值化

为了能使分类变量参与模型计算,我们需要将分类变量数值化,也就是编码。分类变量又可以分为二项分类变量、有序分类变量和无序分类变量。不同种类的分类变量编码方式也有区别。

实际上,只有样本外数据上的模型评分结果才真正有用!(否则的话,直接用参照表好了!)

3.2.1 二分类变量编码

根据上文的输入变量描述,可以认为变量default 、housing 和loan 为二分类变量,对其进行0,1编码。代码如下:

def encode_bin_attrs(data, bin_attrs):    
    for i in bin_attrs:
        data.loc[data[i] == 'no', i] = 0
        data.loc[data[i] == 'yes', i] = 1
    return data

例如:
-癌症检测(Cancer detection):MD Anderson的医生和研究人员(1993)使用神经网络来进行癌症检测,惊奇地发现,训练时间越长(从几天延长至数周),对训练集的性能改善非常轻微,但在测试集上的性能却明显下降。
永利平台娱乐,-机器学习或计算机科学研究者常常试图让模型在已知数据上表现最优,这样做的结果通常会导致过度拟合(overfit)。

3.2.2 有序分类变量编码

根据上文的输入变量描述,可以认为变量education是有序分类变量,影响大小排序为"illiterate", "basic.4y", "basic.6y", "basic.9y", "high.school", "professional.course", "university.degree", 变量影响由小到大的顺序编码为1、2、3、...,。代码如下:

def encode_edu_attrs(data):
    values = ["illiterate", "basic.4y", "basic.6y", "basic.9y", 
    "high.school",  "professional.course", "university.degree"]
    levels = range(1,len(values)+1)
    dict_levels = dict(zip(values, levels))
    for v in values:
        data.loc[data['education'] == v, 'education'] = dict_levels[v]
    return data

解决方法:
解决这个问题的典型方法是重抽样(Re-Sampling)。重抽样技术包括:bootstrap、cross-validation、jackknife、leave-one-out...等等。

3.2.3 无序分类变量编码

根据上文的输入变量描述,可以认为变量job,marital,contact,month,day_of_week为无序分类变量。需要说明的是,虽然变量month和day_of_week从时间角度是有序的,但是对于目标变量而言是无序的。对于无序分类变量,可以利用哑变量(dummy variables)进行编码。一般的,n个分类需要设置n-1个哑变量。例如,变量marital分为divorced、married、single,使用两个哑变量V1和V2来编码。

marital

V1

V2

divorced

0

0

married

1

0

single

0

1

Python的pandas包提供生成哑变量的函数,故代码如下:

def encode_cate_attrs(data, cate_attrs):
    data = encode_edu_attrs(data)
    cate_attrs.remove('education')
    for i in cate_attrs:
        dummies_df = pd.get_dummies(data[i])
        dummies_df = dummies_df.rename(columns=lambda x: i+'_'+str(x))
        data = pd.concat([data,dummies_df],axis=1)
        data = data.drop(i, axis=1)
    return data
  1. 只依赖一项技术(Rely on One Technique)
    IDMer:这个错误和第10种错误有相通之处,请同时参照其解决方法。没有对比也就没有所谓的好坏,辩证法的思想在此体现无遗。

3.3 数值特征预处理

“当小孩子手拿一把锤子时,整个世界看起来就是一枚钉子。”要想让工作尽善尽美,就需要一套完整的工具箱。
不要简单地信赖你用单个方法分析的结果,至少要和传统方法(比如线性回归或线性判别分析)做个比较。

3.3.1 连续型特征离散化

将连续型特征离散化的一个好处是可以有效地克服数据中隐藏的缺陷: 使模型结果更加稳定。例如,数据中的极端值是影响模型效果的一个重要因素。极端值导致模型参数过高或过低,或导致模型被虚假现象"迷惑",把原来不存在的关系作为重要模式来学习。而离散化,尤其是等距离散,可以有效地减弱极端值和异常值的影响。

通过观察2.2节的原始数据集的统计信息,可以看出变量duration的最大值为4918,而75%分位数为319,远小于最大值,而且该变量的标准差为259,相对也比较大。因此对变量duration进行离散化。具体地,使用pandas.qcut()函数来离散化连续数据,它使用分位数对数据进行划分(分箱: bining),可以得到大小基本相等的箱子(bin),以区间形式表示。然后使用pandas.factorize()函数将区间转为数值。

    data[bining_attr] = pd.qcut(data[bining_attr], bining_num)
    data[bining_attr] = pd.factorize(data[bining_attr])[0]+1

研究结果:按照《神经网络》期刊的统计,在过去3年来,只有1/6的文章中做到了上述两点。也就是说,在独立于训练样本之外的测试集上进行了开集测试,并与其它广泛采用的方法进行了对比。

3.3.3 规范化

由于不同变量常常使用不同的度量单位,从数值上看它们相差很大,容易使基于距离度量的学习模型更容易受数值较大的变量影响。数据规范化就是将数据压缩到一个范围内,从而使得所有变量的单位影响一致。

    for i in numeric_attrs: 
        scaler = preprocessing.StandardScaler()
        data[i] = scaler.fit_transform(data[i])
TAG标签:
版权声明:本文由永利平台娱乐发布于新闻动态,转载请注明出处:这些数据与葡萄牙银行机构的直接营销活动有关