当前位置: 首页 > news >正文

day 30 打卡

# 先运行之前的预处理好的代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn  as sns
import warnings
warnings.filterwarnings("ignore")
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
data=pd.read_csv('/Users/gj/东财-学习/python相关资料学习/Python60DaysChallenge-main/data.csv')
#先筛选字符串变量
discrete_features=data.select_dtypes(include=['object']).columns.tolist()
# home owership
home_ownership_mapping={'Owen Home':1,'Rent':2,'Have Mortgage':3,'Home Mortgage':4
}
data['Home Ownership']=data['Home Ownership'].map(home_ownership_mapping)
years_in_job_mapping={'<1 year':1,'1 year':2,'2 years':3,'3 years':4,'4 years':5,'5 years':6,'6 years':7,'7 years':8,'8 years':9,'9 years':10,'10+ years':11
}
data['Years in current job']=data['Years in current job'].map(years_in_job_mapping)
data=pd.get_dummies(data,columns=['Purpose'])
data2=pd.read_csv('/Users/gj/东财-学习/python相关资料学习/Python60DaysChallenge-main/data.csv')
list_final=[]
for i in data.columns:if i  not in data2.columns:list_final.append(i)for i in list_final:data[i]=data[i].astype(int)term_mapping={'Short Term':0,'Long Term':1
}
data['Term']=data['Term'].map(term_mapping)
data.rename(columns={'Term':'Long Term'},inplace=True)
continuous_features=data.select_dtypes(include=['int64','float64']).columns.tolist()
# 连续用中位数
for  feature in continuous_features:mode_value=data[feature].mode()[0]data[feature].fillna(mode_value,inplace=True)from  sklearn.model_selection import train_test_split
X=data.drop(['Credit Default'],axis=1)
y=data['Credit Default']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)from sklearn.ensemble import RandomForestClassifier
from  sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
from sklearn.metrics import confusion_matrix,classification_report
import warnings
warnings.filterwarnings('ignore')
#1.默认参数的随机森林
print('默认参数的随机森林')
import time
start_time=time.time()
rf_model=RandomForestClassifier(random_state=42)   
rf_model.fit(X_train,y_train)
rf_pred=rf_model.predict(X_test)
end_time=time.time()
print(f'训练耗时:{end_time-start_time:.4f}秒')
print("\n 默认参数的随机森林的分类报告")
print(classification_report(y_test,rf_pred))
print("默认随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test,rf_pred))降征降维一般有两种策略:
1、特征筛选: 从n 个特征中筛选m个特征,比如方差筛选,剔除方差过小的特征;利用皮尔逊相关系数筛选;lasso筛选,利用树模型自带的重要性,shap 重要性筛选,特征递归方法
2、特征组合: 从n 个特征中组合出m 个特征,如pca等
特征筛选
方差筛选
方差筛选是一种简单而有效的特征筛选方法,他的核心逻辑是: 特征的方差反映了数据的变化程度,方差很小的特征几乎没有变化,对模型的预测帮助不大。比如,一个特征的值在所有样本中几乎都一样(方差接近0)那么他对区分不同的类型或者预测结果几乎没有贡献。因此,方差筛选会设定一个方差阀值,剔除方差低于这个阀值的特征,保留哪些变化较大的特征,从而减少特征数量,提高模型效率。
这种方法特别适合处理高维数据,能快速去掉不重要的特征,但他不考虑特征与目标变量之间的关系,可能回误删一些低方差但是有意义的特征#1、打印标题,表明这是方差筛选的部分
print("--- 方差筛选 (Variance Threshold) ---")
#导入需要的工具库
from sklearn.feature_selection import VarianceThreshold 
import time 
start_time = time.time()# 创建方差筛选器,设置方差为0.01
# 阀值是指定方差的最小值,低于这个阀值的特征会被剔除
selector = VarianceThreshold(threshold=0.01)# 对训练数据进行方差,fit_transform会计算每个特征的方差并剔除不满足的特征
# x-train是原始训练数据,X_train_variance是筛选后的训练数据
X_train_var= selector.fit_transform(X_train)
# 对测试数据应用同样的筛选规则,transform会直接用训练数据的筛选结果处理测试数据
# X_test是原始测试数据,X_test_var是筛选后的测试数据
X_test_var = selector.transform(X_test)
# 获取被保留下来的特征名称
# selector.get_support()返回一个布尔值列表,表示哪些特征被保留,这个是selector这个实例化的类的一个方法
# X_train.columns是特征的名称,结合布尔值列表可以提取保留特征的名字
selected_features_var = X_train.columns[selector.get_support()].tolist()
# 打印筛选后保留的特征数量和具体特征名,方便查看结果
print(f"方差筛选后保留的特征数量: {len(selected_features_var)}")
print(f"保留的特征: {selected_features_var}")# 创建一个随机森林分类模型,用于在筛选后的数据上进行训练和预测
#random_state=42是为了保证每次运行结果一致,方便教学和对比
rf_model_var = RandomForestClassifier(random_state=42)
# 筛选后的训练数据上训练模型
rf_model_var.fit(X_train_var, y_train)
# 用筛选后的模型对测试数据进行预测
# 使用训练好的模型对筛选后的测试数据进行预测
# x_test_var是筛选后的测试特征数据,y_pred_var  是预测的结果
rf_pred_var = rf_model_var.predict(X_test_var)# 记录结束时间,计算整个训练和预测过程的耗时
end_time=time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
# 打印模型在测试集上的分类报告,展示模型的性能
# 分类报告包括精确度、召回率、f1,帮助评估模型的好坏
print("\n方差筛选后随机森林在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_var))
# 打印混淆矩阵,展示模型预测的详细结果
# 混淆矩阵显示了真实标签和预测标签的对应情况,比如多少样本被正确分类,多少被错分
print("方差筛选后随机森林在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_var))

@浙大疏锦行

http://www.lryc.cn/news/594057.html

相关文章:

  • Redis 详解:从入门到进阶
  • MySQL 配置性能优化实操指南:分版本5.7和8.0适配方案
  • 【Anaconda】Conda 虚拟环境打包迁移教程
  • Redis通用常见命令(含面试题)
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • 零基础学习性能测试第二章-linux/jvm/mysql等数据收集环境搭建
  • Feign远程调用
  • 在Ubuntu22系统上离线部署ai-infra-guard教程【亲测成功】
  • 【成品设计】基于STM32的宠物检测系统
  • ubuntu-linux-pycharm-社区版安装与django配置
  • 数据结构自学Days10 -- 二叉树的常用实现
  • 基于Chinese-LLaMA-Alpaca-3的多模态中医舌诊辅助诊断系统设计与实现
  • 【Linux】2. Linux下的C/C++开发环境
  • 使用“桥接模式“,实现跨平台绘图或多类型消息发送机制
  • 元宇宙经济的四个特征
  • Python,GPU编程新范式:CuPy与JAX在大规模科学计算中的对比
  • 数学专业转行做大数据容易吗?需要补什么?
  • 【前端】懒加载(组件/路由/图片等)+预加载 汇总
  • 笔试——Day13
  • 群组功能实现指南:从数据库设计到前后端交互,上班第二周
  • SmartyPants
  • git fork的项目远端标准协作流程 仓库设置[设置成upstream]
  • [硬件电路-55]:绝缘栅双极型晶体管(IGBT)的原理与应用
  • Elasticsearch 简化指南:GCP Google Compute Engine
  • windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug调试
  • Qt 应用程序入口代码分析
  • QT无边框窗口
  • 学习C++、QT---30(QT库中如何自定义控件(自定义按钮)讲解)
  • 在vue中遇到Uncaught TypeError: Assignment to constant variable(常亮无法修改)
  • Ajax简单介绍及Axios请求方式的别名