2015-11-23 60 views
0

我有一個關於scikit-learn的問題。scikit-learn多維特徵

是否可以將多維特徵列表合併到一個特徵向量。 例如: 我有應用程序分析的結果,我想用一個特徵向量來表示一個應用程序。 在網絡流量的情況下,分析結果如下所示:

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

所以在交通列表中的每個字典描述特定應用的一個網絡活動。

我想生成一個特徵向量,其中包含一個應用程序的所有這些信息,以便能夠從各種應用程序的分析結果中生成一個模型。

我該如何用scikit-learn做到這一點?

預先感謝您!

回答

0

如果每個應用程序發送的響應長度相同(例如,第一個應用程序的長度爲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

+0

謝謝你的回答。 在我的真實數據集中,還有一些更多的特性,如每個流量事件的源/目標ip,源/目的端口,響應代碼等。所以即使http_lenght是相同的,也存在完全不同的字段。 是否有任何缺點,如果我生成這樣的特徵向量(不管什麼特徵是非常合理的): feature_vector_dict:{ 「http_length1」:1024,「http_body1」:「http_body_data」,「src_ip1」:「127.0。 0.1「,...,」http_length2「:2048,」http_body2「:」http_body_data2「,」src_ip2「:」127.0.0.1「,... } – user5594750

0

你不能有非數字特徵的特徵值應該是一個什麼數量的方式。

那麼如果你有: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地址的樣例設置該功能。