第35步 机器学习实战DLC:不平衡数据处理(下)

news2024/11/28 6:46:04

失踪人口回归的第二期,继续说一说用PSM处理不平衡数据。

一、啥叫PSM

PSM全称为Propensity Score Matching,翻译过来就是倾向匹配得分,为了省流,让小Chart介绍一下:

放到我们的数据就是:根据某个特征,从对类别0的1671例中挑出一部分来跟类别1来匹配,形成新的数据集,然后建模。其实就是多变少的策略。

可以1:1、1:2、1:3等进行匹配,没啥固定说哪种比例好,慢慢试吧。

多说一句,PSM需要指定匹配的一个或者多个自变量(特征),一般来说,选取人口学特征,比如年龄、性别、民族啥的。也可以根据专业实际情况选别的,反正有个说法即可。

下面来操作:

二、SPSS实现1:1的PSM匹配

高能预警:SPSS22及以上自带1:1的PSM,对于其他版本或者想要体验完整版功能,就要安装相应的软件(R、SPSS R插件、PS matching插件)。据说,超级难装。

说实话,我也是第一次用,然后我看了看我的SPSS版本,哭了:

 没办法,默默装了一个:

 

(1)数据导入:

照着点:文件→导入数据→CSV数据:

 

(2)倾向性评分匹配

照着点:数据→倾向得分匹配→打开对话框:

组指示符:将因变量(outcome)放入;

预测变量:需要匹配的变量放进去,我这就一个,你们也可以放多个;

倾向变量随便起一个名字:JET;

匹配容差,也叫卡钳值,用来设置倾向性评分匹配标准,卡钳值设置的越小,匹配后可比性越好,卡钳值太小会导致匹配难度会加大,我们先设0.02;

个案 ID填入样本的ID,也就是排序的序号;

匹配ID变量名:随便起一个名字,用来明确匹配成功的样本ID;

输出数据集名称:把匹配的观测对象单独输出一个数据集。

 

(3)额外的设置

点击右上角的选项按钮,弹出对话框:

合格个案数变量:新生成一列,用来明确实验组中某一个观测对象,在对照组中有多少个观测对象满足与其匹配的条件;

抽样:不放回抽样,顾名思义;

优先考虑精确匹配优先找实验组和对照组的JET值(倾向变量)一样的;

最优化执行性能:综合考虑精确匹配和基于设定的卡钳值范围内匹配的模糊匹配;

抽取匹配项时随机排列个案顺序:如果对照组有多个满足匹配条件的观测对象,就会随机将其与实验组观测对象匹配。注意是随机,所以为了能重复,需要设置我们熟悉的随机种子数,比如66666。

(4)看结果

(a)点击确定以后,会生成一个新的数据集(JET_M),重点看新变量:

JET_case代表对照组中有几个符合匹配条件的观测对象(等于4,说明有4个对照组观测对象符合匹配条件);

JET是算出的倾向性评分;

Jet_id代表匹配成功的ID号。

(b)看看输出窗口的结果:

 全是模糊匹配,一共152对;

(c)匹配后的数据库整理输出:

首先,把配对成功的数据撸出来:

记得是打开新的数据集(JET_M),照着点:数据→选择个案→打开新窗口:

设定条件,JET_id要大于等于1,筛选出匹配成功的对子;

挑选出来的在生成新的数据集,叫做JET_M_NEW;

记得左边选择ID:

点击确定后,生成新的数据框JET_M_NEW:

然后导出数据成scv文件,转到python试试性能。

(5)Xgboost建模

无脑套代码:

#加载相关包

import xgboost as xgb

from xgboost import plot_importance

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

from sklearn.feature_selection import SelectFromModel

from xgboost import plot_importance

import math

#导入数据

dataset = pd.read_csv('wwd3.csv')

dataset = dataset.fillna(dataset.median())

X = dataset.iloc[:,1:16].values

y = dataset.iloc[:,0].values

#数据拆分成训练集、测试集

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state = 6588)   

#数据归一化

#from sklearn.preprocessing import StandardScaler

#sc = StandardScaler()

#X_train = sc.fit_transform(X_train)

#X_test = sc.transform(X_test)

#模型构建

boost = xgb.XGBClassifier(

                          n_estimators=200,

                          max_depth=9,

                          min_child_weight=3,

                          subsample=0.9,

                          colsample_bytree=0.9,

                          scale_pos_weight=1,

                          gamma=0.1,

                          reg_alpha=7,

                          )

boost.fit(X_train, y_train)

然后悲剧了:

 显示的是格式问题,不是所有数据都是数值型,所以我们怎么看数据的每一列都是什么类型呢?无脑问小Chat即可:

 我们试一下:

 果然,一堆的“object”类型。所以需要把“object”全部改成“float64”,怎么搞,继续问小Chat:

 复制TA提供的2行代码即可,其他不变:

#导入数据

dataset = pd.read_csv('wwd3.csv')

# 将所有能够转换为数字的object类型转换为float64类型

dataset = dataset.apply(pd.to_numeric, errors='coerce')

# 将剩余的object类型转换为float64类型

dataset = dataset.astype('float64')

dataset = dataset.fillna(dataset.median())

X = dataset.iloc[:,1:16].values

y = dataset.iloc[:,0].values

看看结果:

 灵敏度升高了,特异度下降了,至少没那么割裂,不过还有改进空间。毕竟样本量少了那么多,所以还得试试1:n的匹配。

三、R实现1:n的PSM匹配

说实话,我也不知道怎么做。

但是有GPT,问题不大。首先,需要写一个咒语,说清楚我们的需求:

我有一批{数据},数据包括1个因变量“outcome”和38个自变量。我希望通过R进行1:3的倾向性评分匹配,使得“outcome=1”和“outcome=0”的两组的自变量“Age”不存在显著性差异。并且整理和输出进行匹配后的数据,数据格式与{数据}一致,保存为“psm.csv”。请写出R的代码。

数据格式如下,仅列出前5行数据:

{复制你的数据,表头和前4行}

 然后就给了完整代码:

# 安装并加载所需的R包

if (!require(MatchIt)) install.packages('MatchIt')

library(MatchIt)

# 加载数据

data <- read.csv('wwd3.csv', sep = '\t')

# 使用中位数填充缺失值

for (column_name in colnames(data)) {

  median_value <- median(data[[column_name]], na.rm = TRUE)

  data[[column_name]] <- ifelse(is.na(data[[column_name]]), median_value, data[[column_name]])

}

# 提取自变量和因变量

X_columns <- colnames(data)[-1]

y_column <- 'outcome'

# 使用逻辑回归模型进行倾向性评分计算

ps_model <- glm(outcome ~ ., data = data, family = binomial())

# 保存倾向性评分

data$propensity_score <- ps_model$fitted.values

# 1:3的倾向性评分匹配

matched <- matchit(outcome ~ propensity_score, data = data, method = "nearest", ratio = 3)

# 输出匹配后的数据

matched_data <- match.data(matched)

write.csv(matched_data, 'psm.csv', row.names = FALSE)

# 检查匹配结果

summary(matched)

跑了一下,很顺序,无报错。匹配好的数据已经自动输出:

 R的输出框也给出了匹配结果,不过有些乱码,我让GPT帮整理一下:

 

收工!后面跑分类模型大家自己弄了哈。

有了GPT,效率大大提高!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构师需要看透公司的用户心智定位

一个架构师要站在用户的角度去思考架构的规划和设计。把注意力放在用户身上&#xff0c;已经有无数案例证明是可以带来重大商业和技术突破的。 很多创业公司&#xff0c;从初创到倒闭&#xff0c;都没搞清楚自己的目标人群和心智。如果一个公司&#xff0c;能锁定目标人群及其…

7个最佳WooCommerce跨境电商社交媒体插件

在互联的早期&#xff0c;您通常可以将产品直接放到网上并出售。但在今天你必须进行营销和做广告。如果没有包括社交媒体在内的可持续营销策略&#xff0c;您的商店可能会被忽视。值得高兴的是&#xff0c;有很多 WooCommerce跨境电商社交媒体插件可以用来传播信息&#xff0c;…

【CMake 入门与进阶(5)】 CMakeLists.txt 语法规则基础及部分常用指令-续(附使用代码)

project project命令用于设置工程名称&#xff1a; # 设置工程名称为 HELLO project(HELLO)执行这个之后会引入两个变量&#xff1a;HELLO_SOURCE_DIR 和 HELLO_BINARY_DIR&#xff0c;注意这两个变量名的前缀就是工程名称&#xff0c;HELLO_SOURCE_DIR 变量指的是 HELLO 工程…

华为推出首款全栈自主数据库 GaussDB,你怎么看?

鸿蒙套壳&#xff0c;鸿蒙套壳完了ERP套&#xff0c;ERP套壳&#xff0c;ERP套壳完了数据库套壳&#xff0c;数据库套壳完了…… 犹记得GaussDB之前一直宣传是基于PostgreSQL研发而来&#xff0c;不知道今天为啥摇身一变为首款全栈自主分布式数据库了。 基于开源研发改不恶心。…

智能设备管理系统

传统设备实施管理难点&#xff1a; 1、日常工作繁琐&#xff0c;手动纸质记录和 Excel 管理设备数据麻烦&#xff0c;后期难以汇总管理&#xff0c;且数据易丢失。 2、需核对设备巡检、保养、故障维修记录&#xff0c;手动更新设备状态和最近维修时间等。 3、无法实时获取设备最…

大学生网络工程想走网络安全方向该怎么规划?

明确需求,确定方向 网络安全 网络安全 是一个很广的概念&#xff0c;涉及的岗位也是非常多的&#xff0c;有安全服务、安全运维、渗透测试、web安全、安全开发、安全售前等等。可以看看下面每个岗位的要求与自身兴趣能力匹配度再决定最适合自己的方向。 渗透测试/Web安全工程师…

开启人机协作新时代:协作机器人的应用与展望

原创 | 文 BFT机器人 01 蓄势待发&#xff0c;产业变革新引擎 近年来&#xff0c;在政策扶持、资本助推和技术创新的共同作用下&#xff0c;产业迎来发展黄金期。日前&#xff0c;各行各业正经历产业智能化转型&#xff0c;机器人市场规模不断扩大&#xff0c;发展前景广阔&…

万宾建筑结构健康监测系统方案

建筑结构健康监测是现代建筑工程领域的重要措施之一。通过实时监测和评估建筑物的结构状态&#xff0c;可以及早发现潜在的问题&#xff0c;保障建筑物的安全性和稳定性。 随着城市化进程的加速和建筑规模的扩大&#xff0c;建筑结构的安全性和稳定性越来越受到关注。然而&…

chatgpt赋能python:Python快速打开:如何提高Python执行速度

Python 快速打开&#xff1a;如何提高 Python 执行速度 介绍 Python 是一种解释型语言&#xff0c;由于其简洁易读&#xff0c;广泛用于数据科学、机器学习、Web 开发等领域。然而&#xff0c;它的执行速度相对较慢&#xff0c;这通常是由于其解释器中面临的硬件资源限制以及…

如何查看docker下的mysql版本

进入运行的mysql的容器 docker exec -it mysqlserver bash 标红的位置可以是我们运行的别名&#xff0c;也可以为id 我们想连接mysql服务时报错了 我们看下配置文件 cat /etc/my.cnf 可以看到配置文件的sock文件位置并不在/var/lib/mysql文件夹中 这里又两种办法 1.直接修改…

JVM--方法区元空间

前言 本篇对java的JVM线程共享内存中的方法区进行系统性的讲解。 1、方法区&元空间概念 方法区是《Java虚拟机规范》中规定的一个内存区域&#xff0c;它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。 元空间是方法区的实现。方法…

python基础----09-----类、对象、魔法方法、封装、继承、类型注解、多态、数据分析案例

一 初识对象 说白了就是类的实例化&#xff0c;类是一个抽象层的定义。 例如下面class Student就是定义的一个类&#xff0c;它是抽象层&#xff0c;然后stu_1 Student()&#xff0c;我们根据类创建了一个对象&#xff0c;就是对类的实例化&#xff0c;这个实例化对象我们是可…

paas云底座-数字化转型,你真的了解么

云底座是什么&#xff1f; 如图 底座其实就是一个基础打个比方&#xff1a; 把底座看成一块土地&#xff0c;我们在这块土地上可以盖楼房&#xff0c;可以挖一个游泳池&#xff0c;可以开一家饭店 也就是说我们这块土地可以开发很多东西言归正传 云底座其实就是数字化转型的“底…

【快速幂】-迭代法:详解

何为快速幂&#xff1f; 我们经常会计算&#xff1a;。STL中有自带的pow函数&#xff0c;如果当n很大的时候&#xff0c;那么一定会TLE。 因此&#xff0c;我们需要另一种求值的方法&#xff1a;快速幂&#xff01; 快速幂有两种做法&#xff1a;1&#xff1a;递归 2…

谷歌云 | 宣布跨云互连:无缝连接到您的所有云

【本文由Cloud Ace整理发布&#xff0c;Cloud Ace 是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件、谷…

1 软件测试基本概念

文章目录 课程目标1. 入门前的7个基础问题2. 软件测试基本概念2.1 需求的概念2.1.1需求的基本概念2.1.2 从软件测试人员角度看需求2.1.3 为什么需求对软件测试人员如此重要&#xff1f;2.1.4 如何才可以深入理解被测试软件的需求 2.2 bug的概念(了解)2.3测试用例的概念2.3.1 概…

AI读心术

近期&#xff0c;德克萨斯大学奥斯汀分校的神经科学家们展开了一场「AI」实验&#xff0c;利用人工智能聊天机器人ChatGPT&#xff0c;将大脑活动转化为文字信息。 参与实验的志愿者&#xff0c;在进行长达20小时的「训练」后&#xff0c;成功被「AI」识别出正在进行的活动。按…

portraiture宿主插件最新v4中文版本下载及使用教程

自拍怎么可以不修图呢&#xff1f;如果要修图的话&#xff0c;磨皮就是其中非常重要的一环。皮肤看起来细腻光滑了&#xff0c;整个人的颜值都会瞬间拉高。下面就让我们介绍一下磨皮用什么软件好用&#xff0c;什么软件可以手动磨皮的相关内容。portraiture是ps人像修图中常用的…

喜报!恭喜知了堂学员成功通过CISP-PTE证书考试

有人说&#xff0c;大学可以不谈恋爱&#xff0c;但一定要考证。 考证&#xff0c;是大学校园生活的关键一环。充分利用在校时间为后期就业提前储备优势&#xff0c;毕业后如果从事IT领域&#xff0c;证书就是一个高含金量的专业认证&#xff0c;尤其是网络安全行业&#xff0…

干货|SpringBoot-Maven与Gradle多模块搭建

比较熟悉的模式是SpringbootMaven多模块的组织方式&#xff0c;由于近期Gradle势力很猛&#xff0c;据Gradle官网给出的5种压测场景的数据来看&#xff0c;Gradle的处理性能确实比Maven快&#xff0c;所以就来体验一下Gradle怎么做多模块搭建和各种依赖的引入和查看。 对Gradl…