ADD file via upload

This commit is contained in:
Huaizhi 2024-10-17 22:50:12 +08:00
parent 25037ea5dc
commit 5f98f8a1bc
1 changed files with 98 additions and 0 deletions

98
ML_vul/dataProcess.py Normal file
View File

@ -0,0 +1,98 @@
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)