我试图建立一个ML分类模型,以检测欺诈帐户注册。我手头的数据有:姓名、电子邮件地址、坐标(注册时IP地址的经度和纬度)和标签(欺诈与非欺诈)。以下是我的数据集的简短摘要:
>>> dataset.summary
Index(['name', 'email','latitude','longitude','label'],dtype='object')
>>> dataset.shape
(93207, 4)到目前为止,在训练我的模型时,我很难理解如何处理坐标变量。StackExchange上的一些用户建议使用正弦和余弦函数的组合将纬度和经度转换为X、Y和Z坐标。(即https://datascience.stackexchange.com/questions/13567/ways-to-deal-with-longitude-latitude-feature)但是我不知道在我的分类用例中这是否真的是必要的?我已经考虑过将纬度和经度合并为每个记录的一个变量。然而,有些地区的经度值为负值。此外,有些欺诈者可能位于高纬度和经度区域,而另一些欺诈者可能位于低纬度和经度区域。所以,也许把纬度和经度组合成一个变量无助于训练模型?
我也可以把纬度和经度转换成城市名称。但如果我这样做了,一个城市会有类似的拼写与另一个非常遥远的城市,这可能也无助于训练模式。有什么建议吗?
发布于 2018-04-10 07:33:01
有多种方法来处理这个问题。您共享的链接谈到了这样一个事实,即单独处理lat-长,并对它们执行功能缩放。这种方法是很好的,因为假设在球面坐标系中,它们之间的距离更近,在现实生活中它们实际上更接近。
但你的问题不一样。我想你需要知道如何处理你的模型。您可以通过以下方式进行操作。
1.选择正确的模式
并不是所有的机器学习技术都要求您对这些特性进行缩放或规范化。尺度归一化通常是为了使模型相信所有特征都是相等的。这是必需的,因为有些机器学习模型是基于距离度量的,比如KNN、Logistic回归。因此,如果您不执行功能的缩放,它可能会破坏学习。如果您正在使用一些基于树的模型,如DTs或随机森林模型或XGBoost或GBM,我认为您可以使用这些特性,即使不进行缩放。因此,您可以直接在您的功能集中使用lat-long。
2.执行聚类以创建虚拟变量
在这类情况下,您可以使用一些集群技术(如KMeans )来执行lat long的集群,在您的数据集中创建一个名为cluster的特性,并给出其值(集群号或距离)与集群中心之间的距离,然后删除lat长列。您还可以为每个集群创建一个单独的特性,并获取每个集群中心的距离,并将该距离存储到这些变量中。
3.逆向地理编码
正如您已经提到的,您还可以执行反向地理编码以获得城市和国家名称。但在你的情况下,这种方法可能不是一个强有力的预测欺诈。但仅供参考,
from pygeocoder import Geocoder
location = Geocoder.reverse_geocode(12.9716,77.5946)
print("City:",location.city)
print("Country:",location.country)4.我的建议
如果特征空间本质上是线性的,则执行一些分层聚类而不是KMeans,因为KMeans沿着最大方差工作,但是如果它是非线性的,那么最好使用像PAM、CLARA和DBSCAN这样的分层聚类。
https://stackoverflow.com/questions/49743337
复制相似问题