competition-vd/ML_vul/dataProcess.py

98 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.model_selection import GridSearchCV
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score,matthews_corrcoef
from sklearn.preprocessing import OrdinalEncoder
import seaborn as sns
from scipy.stats import normaltest
dir=".//OutputFiles//"
CorrFile="spearman_correlation_target.csv"
NormalResultFile="normality_test_results.csv"
low_corr_features=[]
#数据预处理
def data_process():
data1=pd.read_csv(".//datasets//new_train_feature.csv")
data2=pd.read_csv(".//datasets//new_valid_feature.csv")
data=pd.concat([data1,data2])
df=drop_selected_columns(data)
normal_check(df)
GetSpearmanCorr(df)
data1=drop_selected_columns(data1)
data2=drop_selected_columns(data2)
data1 = data1.drop(columns=low_corr_features)
data2 = data2.drop(columns=low_corr_features)
return data1,data2
# 缺失值处理去掉dataframe的部分特征
def drop_selected_columns(data):
data = data.drop(['function_id', 'cwe_id'], axis=1)
non_na_counts = data.notna().sum()
# 计算总行数的三分之一
threshold = len(data) * (2 / 3)
# 找出需要删除的列
cols_to_drop = non_na_counts[non_na_counts < threshold].index
# 删除这些列
data = data.drop(columns=cols_to_drop)
data = data.drop(columns='project')
return data
def get_test_df():
data3 = pd.read_csv(".//datasets//new_test_feature.csv")
function_id=data3['function_id'].values
data3=drop_selected_columns(data3)
return function_id,data3
#将正态分布检验结果输出到csv文件中
def normal_to_csv(data):
results = []
for column in data.columns:
stat, pvalue = normaltest(data[column].dropna()) # 使用 normaltest 检验正态性
results.append({'Feature': column, 'Statistic': stat, 'P-Value': pvalue})
return results
#正态分布检验
def normal_check(data):
normality_results = pd.DataFrame(normal_to_csv(data))
normality_results.to_csv(dir+NormalResultFile, index=False)
#绘制Spearman相关性的热力图
def plotSpeatman(spearman_corr):
plt.figure(figsize=(20, 16))
sns.heatmap(spearman_corr, annot=True, fmt=".2f", cmap='coolwarm', cbar_kws={'label': 'Spearman Correlation'})
plt.title('Spearman correlation heatmap')
plt.xlabel('Features')
plt.ylabel('Features')
#spearman相关性分析
def GetSpearmanCorr(df):
spearman_corr = df.corr(method='spearman')
#绘制热力图
#plotSpeatman(spearman_corr)
corr_matrix = spearman_corr
print("所有特征和target标签的相关性")
print(corr_matrix['target'])
print("与target标签相关性较低的特征")
low_corr_features = corr_matrix['target'][corr_matrix['target'].abs() < 0.030].index.tolist()
print(low_corr_features)
#输出至CSV文件中
Corr_to_CSV(corr_matrix)
#将相关性矩阵输出到csv文件中
def Corr_to_CSV(corr_matrix):
# 指定CSV文件的路径
csv_file_path = dir+CorrFile
# 将Spearman相关系数矩阵保存为CSV文件
corr_matrix.to_csv(csv_file_path)
def Result_to_File(function_id,target,filename):
df = pd.DataFrame({
'function_id': function_id,
'target': target
})
df_unique = df.drop_duplicates(subset='function_id', keep='first')
# 将处理后的DataFrame保存回CSV文件
df_unique.to_csv(filename, index=False)