将分类网络流量特征转换为数值 - ISCX ***2016 数据集

Posted

技术标签:

【中文标题】将分类网络流量特征转换为数值 - ISCX ***2016 数据集【英文标题】:Converting categorical network traffic features to numerical - ISCX ***2016 dataset 【发布时间】:2020-03-24 10:57:09 【问题描述】:

我正在使用 ISCX ***2016 数据集对加密的网络流量进行分类,我想实现一种深度神经网络技术进行分类。 数据集包括 14 个 pcap 文件,指示 14 类流量,我已将 pcap 文件导出为 csv,添加一列作为类并将它们合并为一个文件。但问题是特征的数据类型,我无法将它们转换为数值特征,我尝试在 Numpy、Pandas 和 Sklearn 中使用建议的常用方法,例如:OneHotEncoderLabelEncoderastypeget_dummies , ... 但他们都没有工作。

我的问题是我应该怎么做才能转换这些功能?如果根本需要转换? 这是我的代码:

from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import make_column_transformer


seed = 9
np.random.seed(seed)
netTraffic = np.loadtxt('netTraffic_100each.csv', delimiter=',', skiprows=1)

# OneHotEncoder
make_column_transformer(
    (OneHotEncoder(), ['Source'], ['Destination'], ['Protocol'], ['Info']))

# LabelEncoder
le = preprocessing.LabelEncoder()
le.fit(['Class'])
list(le.classes_)
le.transform(['Class'])
print(netTraffic.Class.dtypes)

X = netTraffic[:, 0:6]
Y = netTraffic[:, 6]

(X_train, X_test, Y_train, Y_test) = train_test_split(X, Y, test_size=0.3, random_state=seed)

model = Sequential()
model.add(Dense(7, input_dim=6, init='uniform', activation='relu'))
model.add(Dense(6, init='uniform', activation='relu'))
model.add(Dense(14, init='uniform', activation='relu'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(X_train, Y_train, validation_data=(X_test, Y_test), nb_epoch=20, batch_size=5)

scores = model.evaluate(X_test, Y_test)
print("Accuracy: %.2f%%" % (scores[1] * 100))

这是错误:

Traceback (most recent call last):
  File "C:/Users/PycharmProjects/webmining/testNN/neuralNetusingtfSite.py", line 12, in <module>
    netTraffic = np.loadtxt('netTraffic_100each.csv', delimiter=',', skiprows=1)
  File "C:\Users\Anaconda3\envs\webmining\lib\site-packages\numpy\lib\npyio.py", line 1141, in loadtxt
    for x in read_data(_loadtxt_chunksize):
  File "C:\Users\Anaconda3\envs\webmining\lib\site-packages\numpy\lib\npyio.py", line 1068, in read_data
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "C:\Users\Anaconda3\envs\webmining\lib\site-packages\numpy\lib\npyio.py", line 1068, in <listcomp>
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "C:\Users\Anaconda3\envs\webmining\lib\site-packages\numpy\lib\npyio.py", line 775, in floatconv
    return float(x)
ValueError: could not convert string to float: 'Dell_b2:5b:a6'

前几行数据:

我还在这里更新了用于此代码的 csv 文件:https://gofile.io/?c=L8UNYb

【问题讨论】:

【参考方案1】:

看看pd.get_dummies:

import pandas as pd

df = pd.read_csv('netTraffic_100each.csv')
df_encoded = pd.get_dummies(df, drop_first=True)
..

【讨论】:

谢谢:) 我阅读了文档,但我想我没有得到 drop_first 的作用?如果为 True,它将保留第一列,对吗? 在处理分类数据时,在对它们进行热编码时,您可能会遇到multicollinearity。您可能希望避免这种情况,例如,假设您在一列中有 3 个类别 A、B 和 C,在热编码时您有 3 列:col_A, col_B, col_c 和值组合 (1,0,0) or (0,1,0) or (0,0,1)。既然你知道,col_A 是 1,col_B 是 0,那么很明显 col_C 将是 0,这就是我提到的 multicollinearity

以上是关于将分类网络流量特征转换为数值 - ISCX ***2016 数据集的主要内容,如果未能解决你的问题,请参考以下文章

数据预处理 | 使用 sklearn.preprocessing.OrdinalEncoder 将分类特征转换为数值型

决策树如何识别给定文本数据集中的特征?

Spark2.0 特征提取转换选择之二:特征选择文本处理,以中文自然语言处理(情感分类)为例

仅基本一致的数据的分类算法

将PCAP转换为Json文件的神器:joy(安装篇)

特征工程