我有一个80%分类变量的机器学习分类问题。如果我想使用一些分类器进行分类,我必须使用一个热编码吗?我可以不编码地将数据传递给分类器吗?
我试图做以下功能选择:
>
我读了火车文件:
num_rows_to_read = 10000
train_small = pd.read_csv("../../dataset/train.csv", nrows=num_rows_to_read)
我将分类特征的类型更改为“类别”:
non_categorial_features = ['orig_destination_distance',
'srch_adults_cnt',
'srch_children_cnt',
'srch_rm_cnt',
'cnt']
for categorical_feature in list(train_small.columns):
if categorical_feature not in non_categorial_features:
train_small[categorical_feature] = train_small[categorical_feature].astype('category')
我使用一个热编码:
train_small_with_dummies = pd.get_dummies(train_small, sparse=True)
问题是,第三部分经常卡住,尽管我使用的是一个强大的机器。
因此,没有一个热编码,我无法进行任何特征选择,以确定特征的重要性。
你推荐什么?
你可以用numpy来做。eye
和a使用数组元素选择机制:
import numpy as np
nb_classes = 6
data = [[2, 3, 4, 0]]
def indices_to_one_hot(data, nb_classes):
"""Convert an iterable of indices to one-hot encoded labels."""
targets = np.array(data).reshape(-1)
return np.eye(nb_classes)[targets]
indices_to_one_hot(nb_classes,数据)
的返回值现在
array([[[ 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 1., 0.],
[ 1., 0., 0., 0., 0., 0.]]])
. reshape(-1)
用于确保您具有正确的标签格式(您可能还具有[[2],[3],[4],[0]]
)。
更容易使用熊猫进行基本的热编码。如果您正在寻找更多选项,可以使用scikit-learn
。
对于基本的熊猫热编码,您可以将数据帧传递到get_dummies函数中。
例如,如果我有一个名为imdb_movies的数据帧:
...我想一次性编码额定列,我这样做:
pd.get_dummies(imdb_movies.Rated)
这将返回一个新的dataframe
,其中包含一个列,表示存在的每个级别的评级,以及指定给定观察结果的该评级的存在的1或0。
通常,我们希望这是原始dataframe
的一部分。在这种情况下,我们使用“列绑定”将新的虚拟编码帧附加到原始帧上。
我们可以使用Pandas conat函数进行列绑定:
rated_dummies = pd.get_dummies(imdb_movies.Rated)
pd.concat([imdb_movies, rated_dummies], axis=1)
现在,我们可以对完整的数据帧
进行分析。
简单效用函数
我建议您使用一个实用函数来快速完成此操作:
def encode_and_bind(original_dataframe, feature_to_encode):
dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
res = pd.concat([original_dataframe, dummies], axis=1)
return(res)
用法:
encode_and_bind(imdb_movies, 'Rated')
结果:
此外,根据@pmalbu comment,如果您希望该功能删除原始功能_to_encode,则使用此版本:
def encode_and_bind(original_dataframe, feature_to_encode):
dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
res = pd.concat([original_dataframe, dummies], axis=1)
res = res.drop([feature_to_encode], axis=1)
return(res)
您可以同时对多个功能进行编码,如下所示:
features_to_encode = ['feature_1', 'feature_2', 'feature_3',
'feature_4']
for feature in features_to_encode:
res = encode_and_bind(train_set, feature)
方法1:您可以使用pandaspd。获取虚拟对象
。
例1:
import pandas as pd
s = pd.Series(list('abca'))
pd.get_dummies(s)
Out[]:
a b c
0 1.0 0.0 0.0
1 0.0 1.0 0.0
2 0.0 0.0 1.0
3 1.0 0.0 0.0
例2:
下面将把给定的列转换成一个热列。使用前缀有多个假人。
import pandas as pd
df = pd.DataFrame({
'A':['a','b','a'],
'B':['b','a','c']
})
df
Out[]:
A B
0 a b
1 b a
2 a c
# Get one hot encoding of columns B
one_hot = pd.get_dummies(df['B'])
# Drop column B as it is now encoded
df = df.drop('B',axis = 1)
# Join the encoded df
df = df.join(one_hot)
df
Out[]:
A a b c
0 a 0 1 0
1 b 1 0 0
2 a 0 0 1
方法2:使用Scikit学习
使用onehotcoder
的优点是能够fit
一些训练数据,然后transform
一些其他数据使用相同的实例。我们还有handle_unknown
来进一步控制编码器对看不见数据的处理。
给定一个包含三个特征和四个样本的数据集,我们让编码器找到每个特征的最大值,并将数据转换为二进制热编码。
>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
handle_unknown='error', n_values='auto', sparse=True)
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9], dtype=int32)
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]])
以下是此示例的链接:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
我有一个80%分类变量的机器学习分类问题。如果我想使用一些分类器进行分类,我必须使用一个热编码吗?我可以不编码地将数据传递给分类器吗? 我试图做以下功能选择: > 我读了火车文件: 我将分类特征的类型更改为“类别”: 我使用一个热编码: 问题是,第三部分经常卡住,尽管我使用的是一个强大的机器。 因此,没有一个热编码,我无法进行任何特征选择,以确定特征的重要性。 你推荐什么?
问题内容: 对于C ++,我们可以使用OpenMP进行并行编程。但是,OpenMP不适用于Python。如果要并行执行python程序的某些部分,该怎么办? 该代码的结构可以认为是: 其中和是两个独立的功能。为了减少运行时间,如何并行而不是按顺序运行这种代码?代码是: 其中和是两个独立的功能。那是我要平行的地方… 问题答案: 您可以使用多处理模块。对于这种情况,我可以使用一个处理池: 这将产生可以
其中和是两个独立的函数。那就是我想平行的地方...
问题内容: 给出了可变长度特征的列表: 每个样本具有不同数量的功能,并且该功能已经并且很热门。 为了使用sklearn的特征选择实用程序,我必须将转换为2D数组,如下所示: 如何通过sklearn或numpy实现它? 问题答案: 您可以使用scikit中存在的MultiLabelBinarizer专门用于执行此操作。 您的示例代码: 输出: 它也可以与其他feature_selection实用程序
问题内容: 在Python中scp文件的最pythonic方式是什么?我知道的唯一路线是 这是一种骇客,并且在类似Linux的系统之外不起作用,并且需要Pexpect模块的帮助来避免出现密码提示,除非你已经为远程主机设置了无密码的SSH。 我知道Twisted的,但是我希望避免通过低级ssh模块自己实现scp。 我知道,一个支持SSH和SFTP的Python模块;但它不支持SCP。 背景:我正在连
问题内容: node.js是否具有内置的base64编码? 我之所以这样问,是因为from 只能输出十六进制,二进制或ascii数据。例如: 根据文档,可以输出base64编码的数据。但是,不支持base64。我尝试过,它会破裂。 如果我这样做: 那我应该用什么解密呢?十六进制还是base64? 因此,我正在寻找一个函数来对加密的十六进制输出进行base64编码。 问题答案: 缓冲区可用于获取字符