处理数据中的缺失值--填充缺失值

填充指的是利用现有知识/数据来确定缺失的数量值并填充的行为。我们有几个选择,最常见的是用此列其余部分的均值填充缺失值;

我们可以看到原始的数据集中有五行数据的plasma_glucose_concentration有缺失值;

print(pima['plasma_glucose_concentration'].isnull().sum())
# 5

我们可以先看下这5行的数据的具体情况

plasma_empty_index = pima[pima['plasma_glucose_concentration'].isnull()].index
print(pima.loc[plasma_empty_index])
#      times_pregnant plasma_glucose_concentration diastolic_blood_pressure triceps_thickness serum_insulin   bmi  pedigree_function  age  onset_diabetes
# 75                1                         None                       48                20          None  24.7              0.140   22               0
# 182               1                         None                       74                20            23  27.7              0.299   21               0
# 342               1                         None                       68                35          None  32.0              0.389   22               0
# 349               5                         None                       80                32          None  41.0              0.346   37               1
# 502               6                         None                       68                41          None  39.0              0.727   41               1

我们使用列的均值进行填充之后,可以看到缺失值的行数为0,同时可以看到5行对应字段的值都是121.686763;

pima['plasma_glucose_concentration'].fillna(pima['plasma_glucose_concentration'].mean(), inplace=True)
print(pima['plasma_glucose_concentration'].isnull().sum())
print(pima.loc[plasma_empty_index])# 0
#      times_pregnant  plasma_glucose_concentration diastolic_blood_pressure triceps_thickness serum_insulin   bmi  pedigree_function  age  onset_diabetes
# 75                1                    121.686763                       48                20          None  24.7              0.140   22               0
# 182               1                    121.686763                       74                20            23  27.7              0.299   21               0
# 342               1                    121.686763                       68                35          None  32.0              0.389   22               0
# 349               5                    121.686763                       80                32          None  41.0              0.346   37               1
# 502               6                    121.686763                       68                41          None  39.0              0.727   41               1

我们可以直接使用sklearn的SimpleImputer来进行数据的填充;

from sklearn.impute import SimpleImputerimputer = SimpleImputer(strategy='mean')
pima_imputed = imputer.fit_transform(pima)
pima_imputed = pd.DataFrame(pima_imputed, columns=pima_column_names)
print(pima_imputed.loc[plasma_empty_index])
#      times_pregnant  plasma_glucose_concentration  diastolic_blood_pressure  triceps_thickness  serum_insulin   bmi  pedigree_function   age  onset_diabetes
# 75              1.0                    121.686763                      48.0               20.0     155.548223  24.7              0.140  22.0             0.0
# 182             1.0                    121.686763                      74.0               20.0      23.000000  27.7              0.299  21.0             0.0
# 342             1.0                    121.686763                      68.0               35.0     155.548223  32.0              0.389  22.0             0.0
# 349             5.0                    121.686763                      80.0               32.0     155.548223  41.0              0.346  37.0             1.0
# 502             6.0                    121.686763                      68.0               41.0     155.548223  39.0              0.727  41.0             1.0

可以看到所有的列都已经填充,sklearn的填充处理类确实减少了繁琐的填充工作;

print(pima_imputed.isnull().sum())
# times_pregnant                  0
# plasma_glucose_concentration    0
# diastolic_blood_pressure        0
# triceps_thickness               0
# serum_insulin                   0
# bmi                             0
# pedigree_function               0
# age                             0
# onset_diabetes                  0
# dtype: int64

如果我们直接使用0来填充缺失值,同样使用KNN模型得到的准确率是0.7357185298361768,有所降低的;

from sklearn.neighbors import  KNeighborsClassifier
from sklearn.model_selection import  GridSearchCVpima_zero = pima.fillna(0)
X_zero = pima_zero.drop('onset_diabetes', axis=1)
print('learning from {} rows'.format(X_zero.shape[0]))
y_zero = pima_zero['onset_diabetes']knn_params = {'n_neighbors':[1, 2, 3, 4, 5, 6, 7]}
knn = KNeighborsClassifier()
grid = GridSearchCV(knn, knn_params)
grid.fit(X_zero, y_zero)
print(grid.best_score_, grid.best_params_)
# learning from 768 rows
# 0.7357185298361768 {'n_neighbors': 7}

scikit-learn有一个用于构建流水线的内置模块,其会对原始输入数据进行各种预处理;实际的训练过程中,是需要首先划分数据集,如果我们在应用算法之前直接对整个数据集填充值,我们就是在作弊,模型其实学不到任何模式。可以看见,模型的准确率是66%(并不好,但这不是重点)。重点是,训练集和测试集都是用整个X矩阵的均值填充的。这违反了机器学习流程的核心原则。当预测测试集的响应值时,不能假设我们已经知道了整个数据集的均值。

from sklearn.model_selection import train_test_split
from sklearn.neighbors import  KNeighborsClassifierX = pima[['serum_insulin']].copy()
y = pima['onset_diabetes'].copy()
entire_data_set_mean = X.mean()
X = X.fillna(entire_data_set_mean)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=99)
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
score = knn.score(X_test, y_test)
print(score)
# 0.6666666666666666

我们使用训练样本的均值填充训练样本和测试样本的缺失值,然后进行训练;

from sklearn.model_selection import train_test_split
from sklearn.neighbors import  KNeighborsClassifierX = pima[['serum_insulin']].copy()
y = pima['onset_diabetes'].copy()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=99)
X_train_mean = X_train.mean()
X_train = X_train.fillna(X_train_mean)
X_test = X_test.fillna(X_train_mean)
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
score = knn.score(X_test, y_test)
print(score)
# 0.6822916666666666

我们使用Pipeline结合SimpleImputer来使用均值填充数据,查看训练结果;

from sklearn.pipeline import Pipeline
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCVknn_para = {'classify__n_neighbors':[1, 2, 3, 4, 5, 6, 7]}
knn = KNeighborsClassifier()
mean_impute = Pipeline([('imputer', SimpleImputer(strategy='mean')),('classify', knn)])
X = pima.drop('onset_diabetes', axis=1)
y = pima['onset_diabetes']
grid = GridSearchCV(mean_impute, knn_para)
grid.fit(X, y)
print(grid.best_score_, grid.best_params_)
# 0.7305407011289364 {'classify__n_neighbors': 7}

我们使用Pipeline结合SimpleImputer来使用中位数填充数据,查看训练结果;

from sklearn.pipeline import Pipeline
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCVknn_para = {'classify__n_neighbors':[1, 2, 3, 4, 5, 6, 7]}
knn = KNeighborsClassifier()
mean_impute = Pipeline([('imputer', SimpleImputer(strategy='median')),('classify', knn)])
X = pima.drop('onset_diabetes', axis=1)
y = pima['onset_diabetes']
grid = GridSearchCV(mean_impute, knn_para)
grid.fit(X, y)
print(grid.best_score_, grid.best_params_)
# 0.7292589763177999 {'classify__n_neighbors': 7}

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

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

相关文章

pandas 将DataFrame 转为txt文本,去除引号问题

法一(推荐): import numpy as np np.savetxt(file.txt, df[列名]., fmt "%s")法二 此方法会导致原文中多 escapechar’ ’ 这种空格 import csv df[列名].to_csv(file.txt, sep , indexFalse, headerFalse, quotingcsv.QUOTE_NONE,escapechar )参考&am…

c++容器详解Vector、deque、list、set、multiset、map、multimap、queue、stcak、Array

容器 数据结构描述实现头文件向量(vector)连续存储的元素<vector>列表(list)由节点组成的双向链表,每个结点包含着一个元素<list>双向队列(deque)连续存储的指向不同元素的指针所组成的数组<deque>集合(set)由节点组成的红黑树,每个节点都包含着一个元素,…

C++:对象模型和this指针

对象模型&#xff1a; 成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用空间&#xff1a; 1字节 C编译器会给每个空对象也分配一个字节空间&#xff0c;是为了区分空对象占内存的位置 每个…

根据密码构成规则检测密码字符串

从键盘输入密码字符串&#xff0c;程序根据给定密码构成规则检测并给出对应提示。 (笔记模板由python脚本于2023年11月27日 19:27:47创建&#xff0c;本篇笔记适合熟悉Python字符串str对象的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.…

Android12之logcat日志显示颜色和时间(一百六十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Android 12 打开网络ADB并禁用USB连接ADB

平台 RK3588 Android 12 Android 调试桥 (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具&#xff0c;可让您与设备进行通信。adb 命令可用于执行各种设备操作&#xff0c;例如安装和调试应用。adb 提供对 Unix shell&#xff08;可用来在设备上运行各种命令&am…

ABAP: JSON 报文解析——/ui2/cl_json

1、JSON数组 报文格式如下&#xff0c;是JSON 数组类型的。 [{"I_TYPE":"V","I_BUSINESSSCOPE":"1001"},{"I_TYPE":"V","I_BUSINESSSCOPE":"1002"} ] json转换为SAP内表&#xff1a; TYP…

Redis入门保姆级教程

1. Redis入门 1.1 Redis简介 Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网:https://redis.io 中文网:https://www.redis.net.cn/ key-value结构存储&#xff1a; 主要特点&#xff1a; 基于内存存储&#xff0c;读写…

Gin框架如何使用并搭建一个后台管理系统(五)

如何判断用户登录是否登录????? 一、如何判断用户登录成功与否 1.请求接口 post : localhost:8888/admin/doLogin <form action="/admin/doLogin" method="post" id="myform"> <input type="hidden&qu…

五周年活动周历!AutoGen解析·技术畅聊·3大城市工坊本周启动!

飞桨星河社区在成立的5年以来&#xff0c;已汇集660万AI开发者&#xff0c;覆盖深度学习初学者、在职开发者、企业开发者、高校教师、创业者等&#xff0c;已成为AI领域最具影响力的社区之一&#xff0c;无论是AI爱好者还是AI开发者&#xff0c;都能在这里探索AI的无限可能。 飞…

docker 安装jekins

使用 Docker 安装 Jenkins 并实现项目自动化部署-阿里云开发者社区 http://mirror.esuni.jp/jenkins/updates/update-center.json Jenkins插件安装失败时这么做就搞定啦&#xff01; - 知乎 https://plugins.jenkins.io/maven-plugin/releases/ docker 安装jenkins下载不了…

uni-popup TypeError: Cannot read property ‘open‘ of undefined

我的代码是没问题的&#xff0c;因为之前popup没有问题&#xff0c;换了笔记本&#xff0c;重新安装了hbuilderx&#xff0c;现在uni-popup在页面的底端都显示出来了&#xff0c; 原因&#xff1a;uni-popup插件问题&#xff0c; 解决&#xff1a;我卸载hbuilder重新下了一遍&a…

计算机毕业设计|基于SpringBoot+MyBatis框架的仿天猫商城购物系统设计与实现

计算机毕业设计|基于SpringBootMyBatis框架的仿天猫商城购物系统设计与实现 迷你仿天猫商城是一个基于SSM框架的综合性B2C电商平台&#xff0c;需求设计主要参考天猫商城的购物流程&#xff1a;用户从注册开始&#xff0c;到完成登录&#xff0c;浏览商品&#xff0c;加入购物…

linux查看emmc分区信息(10种方法 )

目录 ## 1 emmc ## 2 uboot查看 ## 3 kernel查看 方法1 方法2 方法3 方法4 方法5 方法6 方法7 方法8 方法9 方法10 ## 1 emmc 我们要说的是&#xff0c;User Data Partition中的再分区 可简化为 ## 2 uboot查看 u-boot> mmc partPartition Map for MMC device…

C++值常用集合算法

C值常用集合算法 set_intersection #include<iostream> using namespace std; #include<vector> #include<numeric> #include<algorithm>class MyPrint { public:void operator()(int val){cout << val<<" ";} };void test() {v…

nodejs+vue+mysql皮具行李箱包包网上商城购物网站

本系统可分为两个大的模块&#xff0c;即前台用户模块和后台管理员模块&#xff0c;前台用户模块用户可以进行浏览查询皮具的各种信息&#xff0c;添加购物车&#xff0c;下订单等各种操作。后台管理员模块管理员可以进行皮具的处理&#xff0c;还有处理订单&#xff0c;皮具分…

卡尔曼滤波之大杂烩

扩展卡尔曼滤波代码和数据卡尔曼滤波数据融合算法卡尔曼滤波器&#xff08;Kalman filtering&#xff09;扩展卡尔曼滤波EKF与多传感器融合卡尔曼算法笔记---思想和实际应用物理含义的理解KF、EKF、UKF在传感器融合当中的应用卡尔曼滤波的理解以及参数调整无人驾驶技术——无损…

【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值

【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值 实现Ordered接口getOrder()方法&#xff0c;数值越小越靠前执行&#xff0c;记得这一点就OK了。 1. 获取请求参数RequestBody Component Slf4j AllArgsConstructor public class HttpRequestFilter implements Glo…

linux常见环境安装

一、安装java: 1、下载安装文件&#xff0c;例如&#xff1a;jdk-8u231-linux-x64.tar.gz&#xff1b; 2、将安装文件上传至/usr/local目录中&#xff1b; 3、tar -xzvf jdk-8u231-linux-x64.tar.gz 进行解压&#xff1b; 4、vim etc/profile &#xff0c;在最底部添加配置&…

人工智能学习2(python数据清洗)

编译工具&#xff1a;PyCharm 一.数据清洗 转化数据类型、处理重复数据、处理缺失数据 import pandas as pddf pd.read_csv("/data.csv") df.sample(10) # 用于随机获取数据并返回结果 df.head(10) # 查看前十条数据 df.tail(10) # 查看后十条数据 df.shape …