2014-04-24 56 views
5

我的数据由连续和分类特征组合而成。下面是我的数据看起来像CSV格式(认为它是由在不同的城市工作专卖店超级连锁店收集的数据)如何对sklearn中的连续属性进行离散化?

city,avg_income_in_city,population,square_feet_of_store_area, store_type ,avg_revenue 
NY ,54504   , 3506908 ,3006      ,INDOOR , 8000091 
CH ,44504   , 2505901 ,4098      ,INDOOR , 4000091 
HS ,50134   , 3206911 ,1800      ,KIOSK  , 7004567 
NY ,54504   , 3506908 ,1000      ,KIOSK  , 2000091 

她可以看到avg_income_in_city,square_feet_of_store_area和avg_revenue一个小片段是连续的值,其中城市,store_type等是分类类(并且我没有在这里展示几个以保持数据的简洁性)。

我希望对数据进行建模以预测收入。问题是如何使用sklearn'Discretizate'连续值? sklearn提供任何“现成”类/方法来实现连续值的离散化吗? (就像我们在Orange例如Orange.Preprocessor_discretize(数据,方法= orange.EntropyDiscretization())

谢谢!

+1

我不明白为什么你应该斌/离散化连续变量。这是扔掉信息。 –

+0

我想这取决于你正在使用的数据的类型以及你的管道中有多好的后续机制利用这些信息。有时候,矢量量化或一般的聚类作为预处理可以使表示更加稳定。 – eickenberg

回答

4

您也可以考虑绘制分类变量的数值,例如,通过指标变量,过程也是已知的如一个热编码

尝试

from sklearn.preprocessing import OneHotEncoder 

和装配到您的分类数据,随后的数值估计方法,例如线性回归。只要没有太多类别(城市可能有点太多),这可以很好地工作。对于连续变量的离散化,您可以考虑使用适应的bin大小,或者等价地,在直方图归一化之后进行均匀分箱来进行分组。 numpy.histogram可能会对您有所帮助。此外,尽管Fayyad-Irani集群并未在sklearn中实施,请随时查看sklearn.cluster以获取数据的自适应离散(即使它仅为1D),例如通过KMeans。

+0

我正在寻找一些sklearn现成的类,但似乎没有一个现成的。我会做一些连续的值(带有一些聚类算法)并且适合数据,但这又是一些工作! –

+1

您可能想尝试['numpy.histogram'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html)。我不确定是否有智能/有效的方法来计算直方图,这些方法对信息检索很有效。 – eickenberg

7

答案是否定的。 scikit-learn中没有分档。正如eickenberg所说,你可能想要使用np.histogram。 scikit-learn中的特征被假定为连续的,而不是离散的。没有分档的主要原因可能是大部分sklearn是在文本,图像特征或来自科学界的数据集上开发的。在这些设置中,分箱很少有帮助。你知道一个免费可用的数据集,其中分箱真的很有用吗?

+0

这听起来像是问题的实际答案,即“否”。 – eickenberg

+0

嗨安德烈亚斯,我没有尝试任何自由可用的数据集自己binning,但是你可以检查'泰坦尼克号数据集'性别,类等是明确的特征和年龄是实数。数据集对存活的类进行分类=是/否,这又是分类的。在这种情况下,如果您必须运行分类算法(如决策树),那么_bin_功能“年龄”有帮助吗? –

+2

实际上我并不认为binning对树有意义,但它可能有助于此数据集上的线性分类器。 –

0

,你可以使用pandas.cut方法,像这样:

bins = [0, 4, 10, 30, 45, 99999] 
labels = ['Very_Low_Fare', 'Low_Fare', 'Med_Fare', 'High_Fare','Very_High_Fare'] 
train_orig.Fare[:10] 
Out[0]: 
0  7.2500 
1 71.2833 
2  7.9250 
3 53.1000 
4  8.0500 
5  8.4583 
6 51.8625 
7 21.0750 
8 11.1333 
9 30.0708 
Name: Fare, dtype: float64 

pd.cut(train_orig.Fare, bins=bins, labels=labels)[:10] 
Out[50]: 
0   Low_Fare 
1 Very_High_Fare 
2   Low_Fare 
3 Very_High_Fare 
4   Low_Fare 
5   Low_Fare 
6 Very_High_Fare 
7   Med_Fare 
8   Med_Fare 
9   High_Fare 
Name: Fare, dtype: category 
Categories (5, object): [High_Fare < Low_Fare < Med_Fare < Very_High_Fare < Very_Low_Fare]