一、Mini Batch K-Means聚类
Mini Batch K-Means算法是K-Means算法的一种优化变种,采用小规模的数据子集减少计算时间,同时试图优化目标函数。可以减少K-Means算法收敛时间
● 数据导入以及数据抽样
● 导入
from sklearn.cluster import MiniBatchKMeans
● keans定义
kmeans = MiniBatchKMeans(n_clusters=1000, random_state=0).fit(X) n_clusters = 1000 说明有1000个中心点 (为什么设置1000个中心点?)
● 标签赋值
klabel=kmeans.labels_
● 将kLabel和Label互换位置
cols = list(df_major) cols.insert(78, cols.pop(cols.index('Label'))) df_major = df_major.loc[:, cols] #将表格中列的顺序换成cols的顺序#
● 将结果分组并且按照百分比抽样
def typicalSampling(group): name = group.name frac = 0.008 return group.sample(frac=frac) #按照百分比抽样 result = df_major.groupby('klabel', group_keys=False).apply(typicalSampling) # 输出Label标签的计数结果 result['Label'].value_counts()
● 将抽样结果保存
result = result.drop(['klabel'],axis=1) result = result.append(df_minor) #添加之前的少量样本 result.to_csv('./data/CICIDS2017_sample_km.csv',index=0)
● 数据分割(训练集和测试集)
● 读取数据
df=pd.read_csv('./data/CICIDS2017_sample_km.csv')
● X和Y的选择
X = df.drop(['Label'],axis=1).values #返回给定DataFrame的numpy表示形式 y = df.iloc[:, -1].values.reshape(-1,1) y=np.ravel(y)
● 数据分割(训练集0.8, 测试集0.2)
X_train, X_test, y_train, y_test = train_test_split(X,y, train_size = 0.8, test_size = 0.2, random_state = 0,stratify = y)
● 特征选择
● 互信息法相关过滤性 mutual_info_classif
from sklearn.feature_selection import mutual_info_classif importances = mutual_info_classif(X_train, y_train) # 统计每个特征和标签之间的互信息量,值越大说明越相关
● 计算重要性的和
f_list = sorted(zip(map(lambda x: round(x, 4), importances), features), reverse=True)
round(x,4) :保留四位小数
map(function, iterable) : 将序列中的每个元素作为函数的参数进行计算
zip() : 将对象中的元素打包成一个个tuple,也就是说将两个参数一一对应打包到一起,最后返回一个 iterable(可迭代对象) sorted函数可以对可迭代类型的容器内的数据进行排序 Sum = 0 fs = [] for i in range(0, len(f_list)): Sum = Sum + f_list[i][0] fs.append(f_list[i][1])
● 根据特征相关性排序,累加值达到0.9时跳出
Sum2 = 0
fs = [] for i in range(0, len(f_list2)): Sum2 = Sum2 + f_list2[i][0] fs.append(f_list2[i][1]) if Sum2>=0.9: break ```
● 将提取出来的特征赋值
```X_fs = df[fs].values X_fs.shape```