ISCC数据思维赛

前言

任务说明

本赛题需要参赛队伍根据给出的训练数据,包含86178条具有数据包标识符、网络协议类型、网络服务类型等信息训练一个判别物联网设备网络行为的模型,使用模型判别测试集中的数据属于哪种行为(共12类)。

数据说明

该数据集中每行都有数据包标识符、网络协议类型、网络服务类型等信息。

训练数据集含有86178条有关物联网设备的网络信息。

测试数据集含有36939条有关物联网设备的网络信息。

数据字段说明:

1.[训练集]包含流量特征与标签信息:train_data.csv

2.[测试集]包含流量特征信息:test_data.csv

提交要求

提交csv文件,使用UTF-8编码格式,提交的字段格式样例如下,csv 文件应包含两列:idAttack_type,该文件应包含标头,并具有以下格式:

id Attack_type
1 DOS_SYN_Hping
2 NMAP_OS_DETECTION
3 ARP_poisioning
etc.

代码

说明就是需要实现一个大模型分类的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score

# 加载数据集
train_data = pd.read_csv('C:\\Users\coke\Desktop\物联网对抗性网络行为判别_kgjC0nI\\train_data.csv')
test_data = pd.read_csv('C:\\Users\coke\Desktop\物联网对抗性网络行为判别_kgjC0nI\\test_data.csv')

# 预处理:对分类特征进行编码
label_encoders = {}
for column in train_data.columns:
if train_data[column].dtype == object:
le = LabelEncoder()
train_data[column] = le.fit_transform(train_data[column].astype(str))
label_encoders[column] = le
if column in test_data.columns:
test_data[column] = le.transform(test_data[column].astype(str))

# 选择特征和标签
X_train = train_data.iloc[:, 1:84] # 选择第2列到第85列作为特征
y_train = train_data['Attack_type'] # 标签列

# 训练模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 对测试数据进行预测
X_test = test_data.iloc[:, 1:84] # 确保测试数据也是从第2列到第85列
predicted_labels = model.predict(X_test)

attack_types = label_encoders['Attack_type'].inverse_transform(predicted_labels)

# 将id列和预测结果合并
result = pd.DataFrame({
'id': test_data['id'], # 确保 'id' 列存在于你的测试数据中
'Attack_type': attack_types
})

# 保存到 CSV 文件,确保使用 UTF-8 编码
result.to_csv('C:\\Users\coke\Desktop\物联网对抗性网络行为判别_kgjC0nI\\predictions.csv', index=False,encoding='utf-8')

加载数据集

用pandas去加载CSV的数据集,用于后面的训练和测试

1
2
3
# 加载数据集
train_data = pd.read_csv('C:\\Users\coke\Desktop\物联网对抗性网络行为判别_kgjC0nI\\train_data.csv')
test_data = pd.read_csv('C:\\Users\coke\Desktop\物联网对抗性网络行为判别_kgjC0nI\\test_data.csv')

数据编码

模型对于字符的处理不好理解,于是将其转化为对应的编码就行,也就是数字

1
2
3
4
5
6
7
8
9
# 预处理:对分类特征进行编码
label_encoders = {}
for column in train_data.columns:
if train_data[column].dtype == object:
le = LabelEncoder()
train_data[column] = le.fit_transform(train_data[column].astype(str))
label_encoders[column] = le
if column in test_data.columns:
test_data[column] = le.transform(test_data[column].astype(str))

选择参数

选择数据对应的参数为哪一列,对应的结果为哪一列

1
2
3
# 选择特征和标签
X_train = train_data.iloc[:, 1:84] # 选择第2列到第85列作为特征
y_train = train_data['Attack_type'] # 标签列

训练模型

用随机森林模型去训练,n_estimators表示轮数,random_state表示一个随机的值,用于当种子

1
2
3
# 训练模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

测试加保存

用模型去预测,然后给出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 对测试数据进行预测
X_test = test_data.iloc[:, 1:84] # 确保测试数据也是从第2列到第85列
predicted_labels = model.predict(X_test)

attack_types = label_encoders['Attack_type'].inverse_transform(predicted_labels)

# 将id列和预测结果合并
result = pd.DataFrame({
'id': test_data['id'], # 确保 'id' 列存在于你的测试数据中
'Attack_type': attack_types
})

# 保存到 CSV 文件,确保使用 UTF-8 编码
result.to_csv('C:\\Users\coke\Desktop\物联网对抗性网络行为判别_kgjC0nI\\predictions.csv', index=False,encoding='utf-8')