scikit-learn 多维特征

scikit-learn multi dimensional features

我有一个关于 scikit-learn 的问题。

是否可以将多维特征列表合并为一个特征向量。 例如: 我有一个应用程序分析的结果,我想用一个特征向量来表示一个应用程序。 在网络流量的情况下,分析结果如下所示:

    traffic = [
{
"http_body": "http_body_data", "length": 1024
}, 
{
"http_body2": "http_body_data2", "length": 2048
},
 ... and many more
]

因此流量列表中的每个字典都描述了特定应用程序的一个网络activity。

我想生成一个特征向量,其中包含一个应用程序的所有这些信息,以便能够根据各种应用程序的分析结果生成一个模型。

如何使用 scikit-learn 执行此操作?

提前致谢!

如果每个应用程序发送相同长度的响应(例如第一个的长度为 1024,第二个 - 2048 等),您可以将所有结果连接到一个向量中。 例如,如果流量中的响应是序列化列表(例如 json)。

def merge_feature_vector(traffic):
    result = []
    for id, data in enumerate(traffic):
        result.extend(json.loads(data['http_body%s' % id]))
    return result

另一种方法是使用sklearn.feature_hasher。 例如

def encode_traffic(traffic):
    result = {}
    for id, data in enumerate(traffic):
        result['html_body%s' % id] = data['html_body%s' % id]
    return result
...
features = [encode_traffic(traffic) for traffic in train]

h = FeatureHasher(n_features=10)
features = h.fit_transform(features)
features.toarray()

clf = RandomForestClassifier(n_estimators=100)
clf.train(features)

顺便说一下,这主要取决于您在 http_data

中拥有的内容

你不能有非数字特征,特征的值应该是一个数字。

如果你有:ip:127.0.0.1 ip:192.168.0.1 ip:220.220.220.220,你会怎么做? 您创建三个功能:ip_127.0.0.1、ip.192.168.0.1 和 ip.220.220.220.220,如果 ip 的值为 127.0.0.1,则将第一个的值设置为 1,将另外两个设置为零。

如果 ip:val 可以说超过 10 个值,您只需为最常见的特征创建 10 个特征,然后创建一个 ip_other 特征并为所有其他具有另一个 IP 地址的样本设置该特征。