分类&数字特征 - 分类目标 - Scikit学习 - Python

时间:2015-05-16 02:35:37

标签: python scikit-learn target numerical categorical-data

我有一个包含分类和数字列的数据集,我的目标列也是分类。我在Python34中使用Scikit库。我知道在进行任何机器学习方法之前,Scikit需要将所有分类值转换为数值。

我应该如何将分类列转换为数值?我尝试了很多东西,但是我得到了不同的错误,例如“str”对象没有'numpy.ndarray'对象没有属性'items'。

readthese = [3,4,5]
f = open('a_file.txt','r')
for lineno in readthese:
    print(f.readline(lineno+1))
f.close()

我的数据集保存在CSV文件中,这里是我编写的小代码,可以让您了解我想要做的事情:

Here is an example of my data:
 UserID  LocationID   AmountPaid    ServiceID   Target
 29876      IS345       23.9876      FRDG        JFD
 29877      IS712       135.98       WERS        KOI

我需要将x_cat_cols转换为数值,然后将它们添加到x_numeric_cols,这样我的输入(x)值就完整了。

然后我需要将目标函数转换为数值,并将其作为我的最终目标(y)列。

然后我想使用这两个完整集来做一个随机森林:

#reading my csv file
data_dir = 'C:/Users/davtalab/Desktop/data/'
train_file = data_dir + 'train.csv'
train = pd.read_csv( train_file )

#numeric columns:
x_numeric_cols = train['AmountPaid']

#Categrical columns:
categorical_cols = ['UserID' + 'LocationID' + 'ServiceID']
x_cat_cols = train[categorical_cols].as_matrix() 


y_target = train['Target'].as_matrix() 

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

对于目标,您可以使用sklearn' s LabelEncoder。这将为您提供从字符串标签到数字标签(以及反向映射)的转换器。链接中的示例。

至于功能,学习算法通常期望(或最好地使用)序数数据。因此,最好的选择是使用OneHotEncoder转换分类功能。这将为每个类别生成一个新的二进制功能,表示每个类别的开/关。再次,链接中的用法示例。

答案 1 :(得分:0)

这是因为我枚举数据的方式。如果我打印数据(使用另一个样本),您将看到:

>>> import pandas as pd
>>> train = pd.DataFrame({'a' : ['a', 'b', 'a'], 'd' : ['e', 'e', 'f'],
...                       'b' : [0, 1, 1], 'c' : ['b', 'c', 'b']})
>>> samples = [dict(enumerate(sample)) for sample in train]
>>> samples
[{0: 'a'}, {0: 'b'}, {0: 'c'}, {0: 'd'}]

这是一个dicts列表。我们应该这样做:

    >>> train_as_dicts = [dict(r.iteritems()) for _, r in train.iterrows()]
    >>> train_as_dicts
    [{'a': 'a', 'c': 'b', 'b': 0, 'd': 'e'},
     {'a': 'b', 'c': 'c', 'b': 1, 'd': 'e'},
     {'a': 'a', 'c': 'b', 'b': 1, 'd': 'f'}]
Now we need to vectorize the dicts:

>>> from sklearn.feature_extraction import DictVectorizer

>>> vectorizer = DictVectorizer()
>>> vectorized_sparse = vectorizer.fit_transform(train_as_dicts)
>>> vectorized_sparse
<3x7 sparse matrix of type '<type 'numpy.float64'>'
    with 12 stored elements in Compressed Sparse Row format>

>>> vectorized_array = vectorized_sparse.toarray()
>>> vectorized_array
array([[ 1.,  0.,  0.,  1.,  0.,  1.,  0.],
       [ 0.,  1.,  1.,  0.,  1.,  1.,  0.],
       [ 1.,  0.,  1.,  1.,  0.,  0.,  1.]])
To get the meaning of each column, ask the vectorizer:

>>> vectorizer.get_feature_names()
['a=a', 'a=b', 'b', 'c=b', 'c=c', 'd=e', 'd=f']