机器学习-人与机器生数据的区分模型测试 -数据筛选

发布于:2025-05-18 ⋅ 阅读:(18) ⋅ 点赞:(0)

内容继续机器学习-人与机器生数据的区分模型测试

使用随机森林的弱学习树来筛选相对稳定的特征数据

# 随机森林筛选特征
X = data.drop(['city', 'target'], axis=1)  # 去除修改前的城市名称列和目标变量列
y = data['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

rf_model = RandomForestClassifier(n_estimators=100, random_state=42)  # 假设使用随机森林模型
rf_model.fit(X_train, y_train)

feature_importances = rf_model.feature_importances_
feature_names = X.columns
# 打印特征重要性
for feature_name, importance in zip(feature_names, feature_importances):
    print(f"{feature_name}: {importance}")



#特征有消息放入DATAFRAME中
feature_importances_df = pd.DataFrame({'Feature': feature_names, 'Importance': feature_importances})
feature_importances_df = feature_importances_df.sort_values(by='Importance', ascending=False)
feature_importances_df.index = range(1, len(feature_importances_df) + 1)
#feature_importances_df.to_csv('feature_importances.csv', index=False)

# 绘制优化后的特征重要性图
plt.figure(figsize=(12, 8))
plt.barh(
    feature_importances_df['Feature'], 
    feature_importances_df['Importance'],
    height=0.8,
    color='#1f77b4'  # 可选:调整颜色:ml-citation{ref="3" data="citationList"}
)
plt.gca().invert_yaxis()
plt.xlabel('Feature Importance', fontsize=12)
plt.ylabel('Feature', fontsize=12)
plt.title('Feature Importance in Random Forest Model', fontsize=14)
plt.grid(axis='x', linestyle='--', alpha=0.6)  # 可选:添加网格线:ml-citation{ref="3" data="citationList"}
plt.tight_layout()
plt.savefig('feature_importance.png', dpi=300)  # 可选:保存高清图:ml-citation{ref="3" data="citationList"}
plt.show()

计算得出以下特征
在这里插入图片描述

其他指标计算有效性

IV值


#定义计算VIF函数
def calculate_vif(data):
    vif_data = pd.DataFrame()
    vif_data["feature"] = data.columns
    vif_data["VIF"] = [variance_inflation_factor(data.values, i) for i in range(data.shape[1])]
    return vif_data


vif_results = calculate_vif(X)  # X为自变量数据框
print(vif_results)
#VIF ≥ 10时,存在显著共线性

相关系数矩阵

corr_matrix = X.corr()  # X为自变量数据框
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()

共线性

X_matrix = X.values  # X为自变量数据框
cond_number = np.linalg.cond(X_matrix)
print("条件数:", cond_number)
#条件数 > 100时,可能存在显著共线性

容忍度


#容忍度是VIF的倒数,反映变量独立性。
tol = 1 / np.array([variance_inflation_factor(X.values, i) for i in range(X.shape[1])])
print("容忍度:", tol)
#容忍度 < 0.1时,可能存在显著共线性
特征筛选
# 选择重要特征
threshold = 0.01  # 设定阈值
important_features = feature_names[feature_importances > threshold]

#筛选前30个特征
important_features = feature_importances_df['Feature'][:30]

# 构建新的数据集
new_data = data[important_features]
new_data['target'] = data['target']  # 将目标变量添加到新的数据集中

df_temp =temp[important_features]
df_temp['target'] = temp['target']


# 划分训练集和测试集
X = new_data.drop('target', axis=1)
y = new_data['target']

X_temp =df_temp.drop('target', axis=1)
y_temp = df_temp['target']



#重新划分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 数据标准化
scaler = StandardScaler()  # 假设使用标准化方法
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

上述代码的运行效果
IV值
在这里插入图片描述
相关性矩阵
在这里插入图片描述
共线与容忍度
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到