精华内容
下载资源
问答
  • 社交媒体数据挖掘重要性

    千次阅读 2015-04-01 16:34:19
    社交媒体是现在很多人需要用到的交流工具,例如微信,微博,博客等等,那么如何从社交媒体当中获得有效的数据成为了一个非常重要的问题。
    社交媒体是现在很多人需要用到的交流工具,例如微信,微博,博客等等,那么如何从社交媒体当中获得有效的数据成为了一个非常重要的问题。
    
    展开全文
  • 文章目录一、matplotlib的介绍二、图表的构成三、线性图形的绘制1.绘制的基本过程2.使用交互式显示方式3....3.良好的操作系统兼容 4.绘制印刷级别的高质量图表 5.可以在Python的脚本、Python Shell、IPython Shel
  • 在打比赛的时候一直贯穿的思考,大概就是判别各个特征的重要性。 在建立模型之前,特征重要性能够帮助训练模型,防止过拟合,提升模型的RUC效果。 建立模型之后,特征重要性能够增强模型(集成模型 非深度学习模型...

    在打比赛的时候一直贯穿的思考,大概就是判别各个特征的重要性。

    在建立模型之前,特征重要性能够帮助训练模型,防止过拟合,提升模型的RUC效果。

    建立模型之后,特征重要性能够增强模型(集成模型 非深度学习模型)的可解释性,帮助建立模型信任、做出现实意义上的决策。

    建模前特征重要性判别

    要构建数值型连续变量的监督学习模型,最重要的方面之一就是好好理解特征。观察一个模型的部分依赖图有助于理解模型的输出是如何随着每个特征变化而改变的。

    1.featexp

    一位名叫Abhay Pawar的小哥开发了一些特征工程和机器学习建模的标准方法。

    • 特征理解
    • 识别嘈杂特征
    • 特征工程
    • 特征重要性
    • 特征调试
    • 泄漏检测与理解
    • 模型监控

    特征理解

                                                         

    如果因变量 (分析目标) 是二分类数据,散点图就不太好用了,因为所有点不是0就是1。针对连续型变量,数据点太多的话,会让人很难理解目标和特征之间的关系。但是,用featexp可以做出更加友好的图像。

                                

    Featexp可以把一个数字特征,分成很多个样本量相等的区间(X轴)。然后,计算出目标的平均值 (Mean),并绘制出左上方的图像。在这里,平均值代表违约率。图像告诉我们,年纪 (DAYS_BIRTH) 越大的人,违约率越低。

    这非常合理的,因为年轻人通常更可能违约。这些图能够帮助我们理解客户的特征,以及这些特征是如何影响模型的。右上方的图像表示每个区间内的客户数量。

    get_univariate_plots(data=data_train, target_col='target', features_list=data_train.columns[0:10], data_test=data_test)

    识别嘈杂特征

    嘈杂特征容易造成过拟合,分辨噪音一点也不容易。

    在featexp里,你可以跑一下测试集或者验证集,然后对比训练集和测试集的特征趋势,从而找出嘈杂的特征。

           

                                                                               训练集和测试集特征趋势的对比

    为了衡量噪音影响程度,featexp会计算两个指标:

    • 趋势相关性 (从测试绘图中可见) :如果一个特征在训练集和验证集里面表现出来的趋势不一样,就有可能导致过拟合。这是因为,模型从训练集里学到的一些东西,在验证集中不适用。趋势相关性可以告诉我们训练集和验证集趋势的相似度,以及每个区间的平均值。上面这个例子中,两个数据集的相关性达到了99%。看起来噪音不是很严重!

    • 趋势变化:有时候,趋势会发生突然变化和反复变化。这可能就参入噪音了,但也有可能是特定区间内有其他独特的特征对其产生了影响。如果出现这种情况,这个区间的违约率就没办法和其他区间直接对比了。

    如果训练集和测试集没有相同的趋势:如两者相关性只有85%。有时候,可以选择丢掉这样的特征。

    嘈杂特征的例子

    抛弃相关性低的特征,这种做法在特征非常多、特征之间又充满相关性(95%以上的很多)的情况下比较适用。这样可以减少过拟合,避免信息丢失。不过,别把太多重要的特征都丢掉了;否则模型的预测效果可能会大打折扣。同时,你也不能用重要性来评价特征是否嘈杂,因为有些特征既非常重要,又嘈杂得不得了。

    用与训练集不同时间段的数据来做测试集可能会比较好。这样就能看出来数据是不是随时间变化的了。

    Featexp里有一个 get_trend_stats() 函数,可以返回一个数据框 (Dataframe) ,显示趋势相关性和趋势变化。

    stats = get_trend_stats(data=data_train, target_col='target', data_test=data_test)

                                     

                                                                                  get_trend_stats()返回的数据框

    现在,可以试着去丢弃一些趋势相关性弱的特征了,看看预测效果是否有提高。

    我们可以看到,丢弃特征的相关性阈值越高,排行榜(LB)上的AUC越高。只要注意不要丢弃重要特征,AUC可以提升到0.74。有趣的是,测试集的AUC并没有像排行榜的AUC变化那么大。完整代码可以在featexp_demo记事本里面找到。

    featexp_demo

    https://github.com/abhayspawar/featexp/blob/master/featexp_demo.ipynb

    特征工程

    通过查看这些图表获得的见解,有助于我们创建更好的特征。只需更好地了解数据,就可以实现更好的特征工程。除此之外,它还可以帮助你改良现有特征。下面来看另一个特征EXT_SOURCE_1:

                         

    具有较高EXT_SOURCE_1值的客户违约率较低。但是,第一个区间(违约率约8%)不遵循这个特征趋势(上升并下降)。它只有-99.985左右的负值且人群数量较多。这可能意味着这些是特殊值,因此不遵循特征趋势。幸运的是,非线性模型在学习这种关系时不会有问题。但是,对于像Logistic回归这样的线性模型,如果需要对特殊值和控制进行插值,就需要考虑特征分布,而不是简单地使用特征的均值进行插补。

    特征重要性

    Featexp还可以帮助衡量特征的重要性。DAYS_BIRTH和EXT_SOURCE_1都有很好的趋势。但是,EXT_SOURCE_1的人群集中在特殊值区间中,这表明它可能不如DAYS_BIRTH那么重要。基于XGBoost模型来衡量特征重要性,发现DAYS_BIRTH实际上比EXT_SOURCE_1更重要。

    特征调试

    查看Featexp的图表,可以帮助你通过以下两项操作来发现复杂特征工程代码中的错误:

                    

    零方差特征只展现一个区间

    • 检查要素的总体分布是否正确。由于一些小错误,我个人曾多次遇到类似上述的极端情况。
    • 在查看这些图之前,预先假设特征趋势可能会是怎样,特性趋势如果不像你所期望的那样,这可能暗示了一些问题。坦白地说,这个假设趋势的过程使构建机器学习模型变得更加有趣!

    泄漏检测

    从目标到特征的数据泄漏会导致过拟合。泄露的特征具有很高的特征重要性。要理解为什么在特征中会发生泄漏是很困难的,查看featexp图像可以帮助理解这一问题。

    在“Nulls”区间的特征违约率为0%,同时,在其他所有区间中的违约率为100%。显然,这是泄漏的极端情况。只有当客户违约时,此特征才有价值。基于此特征,可能是因为一个故障,或者因为这个特征在违约者中很常见。了解泄漏特征的问题所在能让你更快地进行调试。

                                  

    理解为什么特征会泄漏

    模型监控

    由于featexp可计算两个数据集之间的趋势相关性,因此它可以很容易地利用于模型监控。每次我们重新训练模型时,都可以将新的训练数据与测试好的训练数据(通常是第一次构建模型时的训练数据)进行比较。趋势相关性可以帮助你监控特征信息与目标的关系是否发生了变化。

     

    这些简单的步骤总能帮助在Kaggle或者实际工作中构建更好的模型。用featexp,花15分钟去观察那些图像,是十分有价值的:它会带你一步步看清黑箱里的世界。

     

    建模后的特征重要性(模型可解释性)

    深度神经网络能够在多个层次进行抽象推断,所以他们可以处理因变量与自变量之间非常复杂的关系,并且达到非常高的精度。但是这种复杂性也使模型成为黑箱,我们无法获知所有产生模型预测结果的这些特征之间的关系,所以我们只能用准确率、错误率这样的评价标准来代替,来评估模型的可信性。

    但我们在构建树类模型(XGBoost、LightGBM等)时,想要知道哪些变量比较重要的话。可以通过模型feature_importances_方法来获取特征重要性。例如LightGBM的feature_importances_可以通过特征的分裂次数或利用该特征分裂后的增益来衡量。

    对模型结果的解释可应用到以下这些场景当中:

    数据收集

    对于从网上下载的数据集,你是无法控制的。但是很多使用数据科学的企业和组织都有机会扩展所收集数据的类型。因为收集新类型的数据可能成本会很高,或者非常麻烦,所以只有在清楚这么做是划算的时候,企业和组织才会去做。基于模型的解释会帮你更好地理解现有特征地价值,进而推断出哪些新数据可能是最有帮助的。

    决策制定

    某些情况下,模型会直接自动做出决策,但是有很多重要的决策是需要人来确定。对于最终需要人来做的决策,模型的可解释性比单纯的预测结果更重要

    建立信任

    许多人在确定一些基本的事实之前,不会信赖你用来做重要决策的模型。鉴于数据错误的频繁出现,这是一种明智的防范措施。在实际业务场景中,如果给出的模型解释符合对方自身对问题的理解,那么即使在基本不具备深入的数据科学知识的人之间,也将有助于建立互相信任的关系。

    1.Permutaion Importance —— 排列重要性

    训练得到一个模型之后,我们可能会问的一个最基本的问题是 哪些特征对预测结果的影响最大?

    这一概念叫做 特征重要性

    我们想用一个人10岁的数据去预测他20岁的身高是多少?

    数据中包含:

    • 有用的特征(10岁时的身高)
    • 较弱的特征(10岁时每天体育锻炼的时间)
    • 对预测基本没有作用的特征(10岁时股票数量)

    排列重要性是要在模型拟合之后才能进行计算。 所以对于给定的身高、股票数量等取值之后,计算排列重要性并不会改变模型或者是它的预测结果。

    相反,我们会问以下问题:如果随机打乱验证数据某一列的值,保持目标列以及其它列的数据不变,那么这种操作会在这些打乱的数据上对预测准确率产生怎样的影响?

    对某一列进行随机排序应当会降低预测的准确率,这是因为产生的数据不再对应于现实世界中的任何东西。如果随机打乱的那一列模型预测对其依赖程度很高,那么模型准确率的衰减程度就会更大。在这个例子中,打乱height at age 10将会让预测结果非常差。但是如果我们随机打乱的是socks owned,那么产生的预测结果就不会衰减得那么厉害。

    有了上述认识之后,排列重要性就按照以下步骤进行计算:

    1. 得到一个训练好的模型
    2. 打乱某一列数据的值,然后在得到的数据集上进行预测。用预测值和真实的目标值计算损失函数因为随机排序升高了多少。模型性能的衰减量代表了打乱顺序的那一列的重要程度。
    3. 将打乱的那一列复原,在下一列数据上重复第2步操作,直到计算出了每一列的重要性。

                                                                   

    排列重要性结果解读

    排在最上面的是最重要的特征,排在最下面是重要性最低的特征。

    每一行的第一个数字表示模型性能衰减了多少(在这个例子中,使用准确率作为性能度量)。

    跟数据科学里面的很多事情一样,在对某一打乱的特征提取重要性的时候,是存在随机性的,所以我们在计算排列重要性的时候,会通过多次打乱顺序的方式重复这一过程。在±后面的数字表示标准差。

    偶尔你会看到负值的排列重要性。在这些情况中,在打乱的数据上得到预测结果比真实数据的准确率更高。这在所选特征与目标基本无关(重要性应该为0)的情况下会出现,但是随机的因素导致预测结果在打乱的数据上表现得更准确。就像这个例子一样,因为没有容忍随机性的空间,这种情况在小的数据集上很常见。

    2.Partial Dependence Plots —— 部分依赖图

    特征重要性展示的是哪些变量对预测的影响最大,而部分依赖图展示的是特征如何影响模型预测的。

    部分依赖图可以用来展示一个特征是怎样影响模型预测的。可以用部分依赖图回答一些与下面这些类似的问题:1. 假如保持其它所有的特征不变,经纬度对房价有什么影响?换句话说,相同大小的房子,在不同的地方价格会有什么差别?2. 在两组不同的人群上,模型预测出的健康水平差异是由他们的负债水平引起的,还是另有原因?

    工作原理

    跟排列重要性一样,部分依赖图也是要在拟合出模型之后才能进行计算。 模型是在真实的未加修改的真实数据上进行拟合的。

    以足球比赛为例,球队间可能在很多方面都存在着不同。比如传球次数,射门次数,得分数等等。乍看上去,似乎很难梳理出这些特征产生的影响。

    为了搞清楚部分依赖图是怎样把每个特征的影响分离出来的,首先我们只看一行数据。比如,这行数据显示的可能是一支占有50%的控球时间,传了100次球,射门了10次,得了1分的球队。

    接下来,利用训练好的模型和上面的这一行数据去预测该队斩获最佳球员的概率。但是,我们会多次改变某一特征的数值,从而产生一系列预测结果。比如我们会在把控球时间设成40%的时候,得到一个预测结果,设成50%的时候,得到一个预测结果,设成60%的时候,也得到一个结果,以此类推。以从小到大设定的控球时间为横坐标,以相应的预测输出为纵坐标,我们可以把实验的结果画出来。

    from matplotlib import pyplot as plt
    from pdpbox import pdp, get_dataset, info_plots
    
    # Create the data that we will plot
    pdp_goals = pdp.pdp_isolate(model=tree_model, dataset=val_X, model_features=feature_names, feature='Goal Scored')
    
    # plot it
    pdp.pdp_plot(pdp_goals, 'Goal Scored')
    plt.show()

                                                                         

    在看上面的部分依赖图的时候,有两点值得注意的地方:

    • y轴表示的是模型预测相较于基线值或最左边的值的变化
    • 蓝色阴影部分表示置信区间。

    2D 部分依赖图

    如果你对特征之间的相互作用感兴趣的话,2D部分依赖图就能排得上用场了。

    key code:
    from sklearn.ensemble.partial_dependence import partial_dependence, plot_partial_dependence
    
    my_plots = plot_partial_dependence(my_model,       
                                       features=[0, 2], # column numbers of plots we want to show
                                       X=X,            # raw predictors data.
                                       feature_names=['Distance', 'Landsize', 'BuildingArea'], # labels on graphs
                                       grid_resolution=10) # number of values to plot on x axis
    

    优点

    pdp的计算是直观的:partial dependence function 在某个特定特征值位置表示预测的平均值,如果我们强制所有的数据点都取那个特征值。在我的经验中,lay people(普通人,没有专业知识的大众)通常都可以很快理解PDPs的idea。

    如果你要计算的PDP的特征和其它特征没有关联,那么PDP可以完美的展示出这个特征大体上上如何影响预测值的。在不相关的情况下,解释是清晰的:PDP展示了平均预测值在某个特征改变时是如何变化的。如果特征是相互关联的,这会变得更加复杂。

    不足

    实际分析PDP时的最大特征个数是2。这不是PDP的错误,而是由于我们人无法想象超过三维的空间。

    有一些 PDP并不展示特征分布。忽略分布可能会造成误解,因为你可能会过度解读具有少量数据的地方。这个问题通过展示一个rug或者histogram在x轴上的方式很容易解决。

    独立性假设是PDP的最大问题,它假设计算的特征和其它特征是不相关的。当特征是相关的时候,我们创造的新的数据点在特征分布的空间中出现的概率是很低的。对这个问题的一个解决方法就是Accumulate Local Effect plots,或者简称ALE plots,它工作在条件分布下而不是边缘分布下。

    多种类的影响可能会被隐藏,因为PDP仅仅展示边际影响的平均值。假设对于一个要计算的特征,一半的数据点对预测有正相关性,一半的数据点对预测有负相关性。PD曲线可能会是一个水平的直线,因为两半数据点的影响可能会互相抵消。然后你可能会得出特征对预测没有影响的结论。通过绘制individual conditional expectation curves而不是aggregated line,我们可以揭示出这种heterogeneous effects。

    3.SHAP VALUES —— 什么影响了你的决定?

     

    SHAP值(SHapley Additive exPlanations的缩写)从预测中把每一个特征的影响分解出来。可以把它应用到类似于下面的场景当中:

    • 模型认为银行不应该给某人放贷,但是法律上需要银行给出每一笔拒绝放贷的原因。
    • 医务人员想要确定对不同的病人而言,分别是哪些因素导致他们有患某种疾病的风险,这样就可以因人而异地采取针对性的卫生干预措施,直接处理这些风险因素。

    工作原理

    SHAP值通过与某一特征取基线值时的预测做对比,来解释该特征取某一特定值的影响。

    可以继续用排列重要性部分依赖图中用到的例子进行解释。

    我们对一个球队会不会赢得“最佳球员”称号进行了预测。

    我们可能会有以下疑问:

    • 预测的结果有多大的程度是由球队进了3个球这一事实影响的?

    但是,如果我们像下面这样重新表述一下的话,那么给出具体、定量的答案还是比较容易的:

    • 预测的结果有多大的程度是由球队进了3个球这一事实影响的,而不是某些基线进球数?

    当然,每个球队都由很多特征,所以,如果我们能回答“进球数”的问题,那么我们也能对其它特征重复这一过程。

    import shap  
    
    #实例化
    explainer = shap.TreeExplainer(my_model)
    
    #计算
    shap_values = explainer.shap_values(data_for_prediction)
    shap.initjs()
    shap.force_plot(explainer.expected_value[1], shap_values[1], data_for_prediction)

     

    我们预测的结果时0.7,而基准值是0.4979。引起预测增加的特征值是粉色的,它们的长度表示特征影响的程度。引起预测降低的特征值是蓝色的。最大的影响源自Goal Scored等于2的时候。但ball possesion的值则对降低预测的值具有比较有意义的影响。

    如果把粉色条状图的长度与蓝色条状图的长度相减,差值就等于基准值到预测值之间的距离。

    要保证基线值加上每个特征各自影响的和等于预测值的话,在技术上还是有一些复杂度的(这并不像听上去那么直接)。我们不会研究这些细节,因为对于使用这项技术来说,这并不是很关键。这篇博客对此做了比较长篇幅的技术解释。

    如果仔细观察一下计算SHAP值的代码,就会发现在shap.TreeExplainer(my_model)中涉及到了树。但是SHAP库有用于各种模型的解释器。

    • shap.DeepExplainer适用于深度学习模型
    • shap.KernelExplainer 适用于各种模型,但是比其它解释器慢,它给出的是SHAP值的近似值而不是精确值。
      下面是用KernelExplainer得到类似结果的例子。结果跟上面并不一致,这是因为KernelExplainer`计算的是近似值,但是表达的意思是一样的。

    4.Summary Plots

    explainer = shap.TreeExplainer(my_model)
    
    shap_values = explainer.shap_values(val_X)
    
    shap.summary_plot(shap_values[1], val_X)

                                                

    图形解释

    • 每个点是一个样本(人),图片中包含所有样本

    • X轴:样本按Shap值排序-

    • Y轴:特征按Shap值排序

    • 颜色:特征的数值越大,越红

    特征解释

    • martial_status2这个特征最重要,且值越大,收入会相对更高,到达一定峰值,会明显下降

    • 年龄也是影响结果的重要特征,年龄小收入普遍低,但年龄到达一定程度,并不会增加收入,存在年龄小,收入高的人群。

    • 收入水平和capital_gain大致呈正相关。

    shap.summary_plot(shap_values[1],X_test, plot_type="bar")
    

                                                    

    上图是特征重要性图谱,由上向下重要性依次减弱。

    shap_values = explainer.shap_values(df)
    shap.dependence_plot('age', shap_values[1], df, interaction_index="capital_gain")
    
     

                                                  

    图形解释:

    • X轴:age

    • Y轴(左):一个样本的age对应的Shap值

    • 颜色:capital_gain越大越红

    特征解释:

    • 排除所有特征的影响,描述age和capital_gain的关系。

    • 年龄大的人更趋向于有大的资本收益,小部分年轻人有大的资本收益。

    5.树GraphViz可视化export_graphviz

    export_graphviz(estimator, out_file='tree.dot', 
                    feature_names = feature_names,
                    class_names = y_train_str,
                    rounded = True, proportion = True, 
                    label='root',
                    precision = 2, filled = True)
    
    from subprocess import call
    call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])
    
    from IPython.display import Image
    Image(filename = 'tree.png')

     

    写到这里就告一段落。

    后来发现了一个更全面的学习博文,更进一步参考。

    https://blog.csdn.net/Datawhale/article/details/103169719

    展开全文
  • 数据挖掘熟悉的小伙伴,数据处理相关的工作时间占据了整个项目的70%以上。数据的质量,直接决定了模型的预测和泛化能力的好坏。它涉及很多因素,包括:准确、完整、一致、时效、可信和解释。而在真实...
    badf40e5b888acaa0218f1e998f91444.png
    1f947de7cfd702fa30ea18cc73ab198d.gif

    为什么数据处理很重要?

    对数据挖掘熟悉的小伙伴,数据处理相关的工作时间占据了整个项目的70%以上。数据的质量,直接决定了模型的预测和泛化能力的好坏。它涉及很多因素,包括:准确性、完整性、一致性、时效性、可信性和解释性。

    而在真实数据中,我们拿到的数据可能包含了大量的缺失值,可能包含大量的噪音,也可能因为人工录入错误导致有异常点存在,非常不利于算法模型的训练。数据清洗的结果是对各种脏数据进行对应方式的处理,得到标准的、干净的、连续的数据,提供给数据统计、数据挖掘等使用。

    小编最近忙于数据挖掘项目,抽了一些时间进行了总结,希望对读者能有所借鉴,也欢迎关注公众号,尽量定期更新所思所想!

    有哪些数据预处理的方法?

    1、缺失值的处理

    • 删除变量:若变量的缺失率较高(大于80%),覆盖率较低,且重要性较低,可以直接将变量删除,否则带来噪声,影响结果
    • 统计量填充:若缺失率较低且重要性较低,可以根据数据分布的情况进行填充。对于数据符合均匀分布,用该变量的均值填补缺失,对于数据存在倾斜分布的情况,采用中位数进行填补。
    • 插值法填充:包括随机插值,多重差补法。
    • 哑变量填充:若变量是离散型,且不同值较少,可转换成哑变量。

    2、离群点处理

    异常值是数据分布的常态,异常分为两种:“伪异常”和“真异常”,真异常由于数据本身分布异常,即离群点。主要有以下检测离群点的方法:

    • 简单统计分析:根据箱线图、各分位点判断是否存在异常,例如pandas的describe函数可以快速发现异常值。3
    • 3倍标准差原则:若数据存在正态分布,偏离均值的3倍标准差之外,范围内的点为离群点。
    • 基于绝对离差中位数、距离:利用聚类算法等

    3、噪声处理

    噪声是变量的随机误差和方差,是观测点和真实点之间的误差,

    通常的处理办法:对数据进行分箱操作,等频或等宽分箱,然后用每个箱的平均数,中位数或者边界值(不同数据分布,处理方法不同)代替箱中所有的数,起到平滑数据的作用

    另外一种做法是,建立该变量和预测变量的回归模型,根据回归系数和预测变量,反解出自变量的近似值。

    4、数据变换

    数据变换包括对数据进行规范化,离散化,稀疏化处理,达到适用于挖掘的目的。

    展开全文
  • 在时间序列数据挖掘中, 时间序列相似是一个重要的概念. 对于诸多算法而言, 能否与一种合适的相似度量方法结合应用, 对其挖掘性能有着关键影响. 然而, 至今仍没有统一的度量相似的方法. 对此, 首先综述了常用的...
  • 相似和相异性是数据挖掘中非常重要的概念,在聚类、KNN、异常检测甚至推荐系统中都有广泛的应用。在某些应用场景中,我们需要的就是数据间的相似度或相异性数据而非原始数据。比如在推荐系统中常用的一个算法是...

    相似性和相异性是数据挖掘中非常重要的概念,在聚类、KNN、异常检测甚至推荐系统中都有广泛的应用。在某些应用场景中,我们需要的就是数据间的相似度或相异性数据而非原始数据。

    比如在推荐系统中常用的一个算法是协同过滤,在协同过滤中我们需要计算物品或用户间的相似度矩阵,在得到相似度矩阵之后,我们就可以直接舍弃原始数据了,接下来我们会直接根据相似度矩阵对用户做个性化推荐。

    一、相似度和相异度简介

    相似度是对两个对象间相似程度的量化,对象间越相似,相似度就越高。

    相异度则是对两个对象间相异程度的量化,对象间越相似,相异度就越低。

    可以看到,相似度和相异度之间既相互对立,又存在着不可分割的联系。一般来说,它们之间存在某种变换关系,是否进行变换以及将它们变换到什么区间范围内,取决于算法的需要和我们的判断。

    变换数值范围

    通常情况下,相似度的取值范围在[0,1]之间。假如我们的相似度数据是在[1,10]之间,我们应该如何将它们变换到我们需要的[0,1]范围内呢?一个非常实用的方法是使用“0-1标准化”手段。设min和max分别是相似度数据中的最小值和最大值,那么针对每个相似度s,我们可以通过s′=(s−min)/(max−min)来完成转换。不过有些时候相似度的取值范围可能在[-1,1]之间,这时正负号包含了一定的信息,它们可能是重要的,这种情况下我们可能会保留其符号,而非强行转换到[0,1]之间。

    相异度的转换有些复杂,这是因为其取值范围往往在[0,∞]之间,要转换到[0,1]之间的话往往会损失一些信息,甚至其尺度会发生一些变化。这个过程往往需要我们结合算法需要以及具体的场景来仔细斟酌判断。

    相似度和相异度之间的转换

    相似度和相异度之间是可以相互转换的。比如在相似度取值范围在[0,1]之间时,我们可以用d=1−s来从相似度数据中得到相异度,这时相异度越接近1,代表数据间距离越远;相异度越接近0,代表数据间距离越近。另一种操作方法是直接对相似度取负。一般来说,单调减函数都可以用来完成相似度和相异度间的转换。

    单个属性的相似度和相异度

    当我们要计算单个属性的相似度和相异度时,针对不同的数据类型,常用如下的计算方式。针对含有多个属性的样本间的相似度和相异度的计算,我们将在下边更详细地展开。

    c263e0d6ae603d7664c6f52cdaeccc7f.png

    二、相异度

    距离

    我们常用距离来作为相异度的衡量指标。针对单个属性时,两个样本间的距离就是它们之间差值的绝对值;针对多个属性时,有多重衡量方法,其中最常用的就是欧几里得距离。

    欧几里得距离是两个样本中的每个属性之间的差值的平方和的平方根,公式如下:

    82a907e32cecd2699c70c1ca0135984c.png

    它代表了两个点之间线段的长度。比如x坐标为(0,0),y坐标为(1,2)那么它们之间的欧几里得距离为:

    171fbf2adca5581ef5dd481c4e285e71.png

    我们可以将欧几里得距离推广得到闵可夫斯基距离:

    080adf1f3ba89e0110d13819275ba343.png

    其中:

    • r=1时,曼哈顿距离;
    • r=2时,欧几里得距离;
    • r=∞时,上确界距离。

    除了距离以外,针对不同的数据类型,我们还有其他的相异度衡量方式,比如集合差或者时间等。

    三、相似度

    相似度的衡量有多种方式,常用的有简单匹配系数、Jaccard系数和Tanimoto系数、余弦相似度、相关性等。

    简单匹配系数

    简单匹配系数适合作为仅包含二元属性(属性仅有两个取值,比如0和1)的数据之间的相似性度量。

    假设我们有两个样本x和y,其中:

    98234e6ee231aea3a045391e2302f172.png

    则,简单匹配系数(SMC)的计算公式为:

    704bfc9da1faf8d84e8aad9102dc9923.png

    也就是说,简单匹配系数是指两个样本中属性取值相同的个数除以属性总数(属性取值相同的个数+属性取值不同的个数)。

    Jaccard系数

    有些时候,两个属性取值相同也许不能代表任何含义。举个例子,有一万种商品,小明购买了一件商品A,小红购买了一件商品B,那么在我们理解,他们之间是没有任何相似性的。但是假如我们使用简单匹配系数来衡量,他们之间的相似度却高达0.9998。

    为了应对这种0-0匹配无意义的情况,我们可以使用Jaccard系数

    59bf0496b72ffcbeaa3482753e863e6e.png

    针对前边我们提到的例子,小明和小红间的Jaccard系数为:

    b4c872a892451741ff144f4ede3fd8e2.png

    广义Jaccard系数

    广义Jaccard系数又称Tanimoto系数,该系数用EJ表示:

    c9840355d3f76c42098b36bd3b8c0703.png

    广义Jaccard系数可以应对非二元的属性,当所有属性均为二元属性时,它可以被归约为Jaccard系数。它也可以用于文档数据。

    余弦相似度

    一般来说,文档用向量表示,向量的每个属性代表了一个特定的词在文档中出现的频率。很容易想到,这里的文档向量大多数都是稀疏的,因为大部分文档都仅仅包含了一部分词,剩下的那些没出现的词都以0值出现在向量中。在这里,没有出现的词是不应该作为相似性的成分的,否则可能大部分文档之间都存在较高的相似度。

    余弦相似度是文档相似性中最常用的度量之一,同时,它还经常用于电商平台计算用户相似度、商品相似度(它们是协同过滤推荐的基础)。相对于Jaccard系数,余弦相似度的一个优点是可以处理非二元的向量(比如这里的词频不可能仅有0和1)。余弦相似度的计算公式为:

    cc3c7d1a64bf60743c90f639923d9c77.png

    由于这里不可能有负值,所以余弦相似度的取值范围是[0, 1],当两个向量的方向完全一致时,它们在坐标系中的夹角为0,其余弦相似度就为1;当它们方向相互垂直时,它们的夹角为90度,余弦相似度为0。

    公式中,很容易发现,x′和y′分别是x向量方向和y向量方向上的单位向量。也就是说,余弦相似度并不在意向量的大小(长度),仅在意他们之间的夹角。

    相关性

    我们还可以用Pearson相关系数来衡量数据间的相似度,它既可以应对二元变量,也可以应对连续变量。它的计算方法是两组数据的协方差除以它们各自标准差的乘积:

    b91bcef600639aebcabf1c9b7d1d9bf8.png

    在这里,协方差的计算公式为:

    3cfe3277afa53305fbf27d3328516756.png

    标准差的计算公式为:

    0bc3c74c9eae78f276cee2a6e41ffa59.png

    我们曾经专门介绍过皮尔逊相关系数,这里就不再赘述了,感兴趣的可以关注我的历史文章。

    另外,常用的相似度还有对数似然相似度(LogLikelihood)、Spearman相关系数等,感兴趣的可以搜索相关文章自行探索,也可以在下方留言,如果感兴趣的人比较多,我会另外写文章来讲解。

    四、如何选择

    一般来说,对于稠密、连续的数据,我们常使用距离度量,比如欧几里得距离。对于稀疏数据(包含大量0-0匹配的数据),我们常用余弦相似度、Jaccard系数和广义Jaccard系数。

    当然,在实际应用过程中,我们还需要考虑更多因素,比如某种度量是否已经得到大规模应用、某种度量是否在使用的软件包中得到良好支持等。

    相似性和相异性的概念在数据挖掘中非常重要,希望大家都能够熟练掌握。

    展开全文
  • 数据挖掘书籍

    2018-03-27 14:02:07
    数据挖掘(概念与技术)》全面而深入地叙述了数据库技术的发展和数据挖掘应用的重要性,数据仓库和OLAP(联机分析处理)技术,数据预处理技术(包括数据清理、数据集成和转换、数据归纳的方法),数据挖掘技术(包括...
  • P16-数据使用-代表数据分析方式 描述式分析Descriptive Analytics 帮助了解发生了什么 总结大规模数据以分析业务结果 可以配合KPI等指标来衡量业务的成功或者失败 诊断式分析Diagnostic Analytics 帮助了解为...
  • 数据挖掘下的用户行为分析 摘要伴随我国网络信息化技术不断创新数据挖掘作为数据分析发展趋势及创新手段其重要性不言而喻通过近年来研究发现数据挖掘应用的科学性与优化性对数据质量提升应用效率提高误差减低等影响...
  • Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Titanic系列之派生属性&维归约 之前的三篇博文已经进行了一次还算完整的特征工程,分析字符串类型的变量获取新变量,对数值变量进行规范化,获取...
  • 成本效率,客观理性,可维护,软件集成,人类工程学,商业过程再建等问题都是数据挖掘成功应用的重要考虑因素。 商业环境中的数据挖掘可以定义为:通过自动分析公司的数据来生成可操作的模型。要在商业环境中使用...
  • 数据挖掘起源于多种学科,其中最重要的是统计学和机器学习。 统计学起源于数学其强调的是数学的精确; 机器学习主要起源于计算机实践其更倾向于实践,主动检测某个东西,来确定它的表现形式。 统计学方法与机器...
  • 以时间顺序挖掘周期的模式(即周期分析)是一种重要数据挖掘方式,在以前的研究中我们假设每个时间点只发生一个事件,然而在这篇文章中我们研究一种更普遍的模式:即在每个时间点可以发生多个事件。...
  • 数据挖掘引论

    2018-07-12 22:49:38
    数据挖掘重要性在当今这个数据爆炸增长的时代,就不需要多说了。下面总结一下数据挖掘的过程。数据挖掘步骤: 数据清理。消除噪声和删除不一致的数据数据集成。多种数据源可以组合在一起数据选择。从数据库中提取...
  • 基于属性重要度约简算法在数据挖掘中的应用研究论文 摘要属性约简是粗糙集理论研究的核心内容之一本文通过对属性重要度的计算以核为基础计算条件属性集中除核以外其他属性的重要性来确定最小的约简最后通过实例分析...
  • 数据挖掘-数据质量分析 本文为从书本学习过程中的摘录 数据质量分析是数据挖掘中数据准备过程中重要的一环,是数据预处理的前提,也是数据挖掘分析结论有效和准确的基础。
  • Data_Preprocessing_Tools 该存储库包含数据处理工具的基础。 分析未经仔细筛选问题的数据可能会产生误导结果。 因此,这是数据科学最重要的步骤之一。
  • 西安工程大学学报 7 ofXian Journal PolytechnicUniversity 第31卷第2期(总144期) 2017年04月 文章编号1674649X(2017)02-...摘要对大数据信息库进行显著特征数据挖掘在故障诊断和模式识别等领域具有重要的应用 价值
  • 重要数据挖掘和机器学习算法

    千次阅读 2013-09-20 20:55:37
    7,数据挖掘流程:数据处理,数据集成 8.数据预处理的重要性 9.svm算法 10.最小二乘法(回归分析) 附上2012年某IT大牛公司面试题: 1.svm算法推导 2.sinx精确值如何求得 3.Fibnacci数列 4.逆波兰式
  • , 本书适用于高等院校信息管理与信息系统专业、电子商务专业、物流管理专业等相关专业本科生教材,也可作为金融类、管理类有关专业研究生教材,同时,对企事业单位数据仓库与数据挖掘工作人员、研究人员有重要参考...
  • 21世纪是数据信息大发展的时代,移动互联、社交网络、电子商务等都极大拓展了其应用范围,各种数据迅速扩张变大。大数据蕴藏着价值信息,但如何从海量数据中淘换出出...1 大数据时代数据挖掘重要性随着互联网、物...
  • 数据挖掘周报

    2020-09-29 12:07:02
    学习数据挖掘的基本理论知识 实验部分 配置python环境:Anaconda库 以及 Pycharm IDE 初步了解比赛网站,尝试查看数据,大致了解数据的用处以及各个数据有什么用处。 TODO 下周对一些数据进行一些重要性的排序,...
  • 数据挖掘和爬虫有区别吗?数据挖掘和爬虫有很大的区别。数据挖掘过程应用于爬虫的可能并不是特别大,但所占比例相对较大。...更重要的是,一旦使用了爬虫,它就是数据挖掘吗?当然,这个问题不是绝对...
  • 作为互联网中重要数据形式之一,半结构化数据是开展数据挖掘重要前提条件。而进行数据挖掘旨在发现并提取大型数据库中所隐含的有价值的信息。首先介绍了半结构化数据的概念及其特点,在此基础上分别从半结构化数据...
  • 离群数据挖掘数据挖掘重要内容, 针对时序数据进行离群数据挖掘方法的研究。首先通过 对时序数据进行离散傅立叶变换将其从时域空间变换到频域空间, 将时序数据映射为多维空间的点, 在 此基础上, 提出一...
  • 本节书摘来自华章出版社《移动数据挖掘》一 书中的第2章,第2.3节,作者连德富 张富峥 王英子 袁晶 谢幸,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.3 重要地点检测 很多移动轨迹数据都具有非常高...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,032
精华内容 812
关键字:

数据挖掘重要性