【机器学习】项目数据处理部分

文章目录

  • 前言
  • 项目理解
  • 数据探索
  • 特征工程
  • 总结


前言

本文参考《阿里云天池大赛赛题解析》,拿到一个项目或者赛题,使用机器学习来进行预测分类,需要以下七个步骤:

  1. 项目(赛题)理解
  2. 数据探索
  3. 特征工程
  4. 模型训练
  5. 模型验证
  6. 特征优化
  7. 模型融合

本本是数据处理,即前3个步骤:项目理解、数据探索,特征工程。


项目理解

简单的了解一下,并不太重要的一个步骤。

  1. 知道项目是干什么的,了解一下项目业务。
  2. 是什么类型的模型,是分类还是回归?可以提前罗列出一些可以用于该模型的机器学习的算法。

数据探索

  1. 需要导入的库:基础库和画图工具
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from scipy import stats

import warnings
warnings.filterwarnings("ignore")
  1. 读取数据文件
train_data_file = "./zhengqi_train.txt"
test_data_file =  "./zhengqi_test.txt"

train_data = pd.read_csv(train_data_file, sep='\t', encoding='utf-8')
test_data = pd.read_csv(test_data_file, sep='\t', encoding='utf-8')

sep是分隔符,根据文件数据用pandas读取。

  1. 查看数据基本信息的方法:
    1)head():查看前五行数据。
    2)info():整体数据的基本信息,包括每一列有多少数据,是什么数据类型等。
    3)describe():查看数据的统计信息。
    4)value_counts():查看标签有几类,每一类有多少数据
    5)groupby('索引名').size() :查看该索引有几类,每一类有多少数据

到这里你需要知道:
1)特征与标签在数据中的位置。
2)特征中有那些是 数字型数据和字符型数据,以及那些是连续型变量和类别型变量。

  1. 可视化数据分布【单变量】
    1)【箱型图】连续型变量:用来识别异常值,在上限与下线之外的点是异常值

在这里插入图片描述

单个变量的箱型图:

fig = plt.figure(figsize=(4, 6))  # 指定绘图对象宽度和高度
sns.boxplot(数据集['索引名'],orient="v", width=0.5)

在这里插入图片描述
画全部变量的箱体图:

# 画箱式图
column = train_data.columns.tolist()[1:]  # 列表头 数据集
fig = plt.figure(figsize=(20, 40))  # 指定绘图对象宽度和高度
for i in range(多少个图):
    plt.subplot(10, 3, i + 1)  # 10行3列 可画30子图
    sns.boxplot(x = train_data[column[i]], orient="v", width=0.5)  # 箱式图
    plt.ylabel(column[i], fontsize=8)
plt.show()

在这里插入图片描述可以看到有异常值,这个异常值只是对影响的特殊数据点的进行检查,它的选择取决于对业务的理解。

2)【柱状图】分类型数据可以通过柱状图来表示:

g = sns.FacetGrid(train_data, col='Diabetes_binary')
g = g.map(sns.histplot, "Sex")
plt.show()

在这里插入图片描述

3)【直方图和Q-Q图】
QQ图是指数据的分位数对比参照的图,如果数据符合正态分布,则所有的点都会落在直线上。

plt.figure(figsize=(10,5))

ax=plt.subplot(1,2,1)
sns.distplot(train_data['BMI'],fit=stats.norm)
ax=plt.subplot(1,2,2)
res = stats.probplot(train_data['BMI'], plot=plt)

在这里插入图片描述画出所有特征的直方图QQ图,看是否近似正态分布:

train_cols = 6
train_rows = len(train_data.columns)
plt.figure(figsize=(4*train_cols,4*train_rows))

i=0
for col in train_data.columns:
    i+=1
    ax=plt.subplot(train_rows,train_cols,i)
    sns.distplot(train_data[col],fit=stats.norm)
    
    i+=1
    ax=plt.subplot(train_rows,train_cols,i)
    res = stats.probplot(train_data[col], plot=plt)
plt.show()

4)【KDE分布图】
训练集数据和测试集数据的分布情况,查看数据分布是否一致

dist_cols = 6
dist_rows = len(test_data.iloc[:,1:].columns)

plt.figure(figsize=(4*dist_cols,4*dist_rows))

i=1
for col in test_data.iloc[:,1:].columns:
    ax=plt.subplot(dist_rows,dist_cols,i)
    ax = sns.kdeplot(train_data[col], color="Red", shade=True)
    ax = sns.kdeplot(test_data[col], color="Blue", shade=True)
    ax.set_xlabel(col)
    ax.set_ylabel("Frequency")
    ax = ax.legend(["train","test"])

    i+=1
plt.show()

在这里插入图片描述有一些特征数据不太一致,就得去掉,很有可能是噪声,影响预测结果。

5)【线性回归关系图】
主要用于分析变量之间的线性回归关系:
单个特征与标签的线性关系:

fcols = 2
frows = 1

plt.figure(figsize=(8,4))

ax=plt.subplot(1,2,1)
sns.regplot(x='V0', y='target', data=train_data, ax=ax, 
            scatter_kws={'marker':'.','s':3,'alpha':0.3},
            line_kws={'color':'k'});
plt.xlabel('V0')
plt.ylabel('target')

ax=plt.subplot(1,2,2)
sns.distplot(train_data['V0'].dropna())
plt.xlabel('V0')

plt.show()

在这里插入图片描述
通过下图看是否有相关性:
在这里插入图片描述
所有特征与标签的线性关系:

fcols = 6
frows = len(test_data.columns)
plt.figure(figsize=(5*fcols,4*frows))

i=0
for col in test_data.columns:
    i+=1
    ax=plt.subplot(frows,fcols,i)
    sns.regplot(x=col, y='target', data=train_data, ax=ax, 
                scatter_kws={'marker':'.','s':3,'alpha':0.3},
                line_kws={'color':'k'});
    plt.xlabel(col)
    plt.ylabel('target')
    
    i+=1
    ax=plt.subplot(frows,fcols,i)
    sns.distplot(train_data[col].dropna())
    plt.xlabel(col)

6)【多变量图】可以支持各种类型的变量分析,是特征分析很好用的工具

sns.pairplot(train_data.iloc[:,1], hue = 'Diabetes_binary')
  1. 可视化数据分布【双变量】
    特征变量和目标变量及特征变量之间的关系:
    热力图:
train_corr = train_data.iloc[:,1:].corr()
# 画出相关性热力图
ax = plt.subplots(figsize=(20, 16))#调整画布大小
ax = sns.heatmap(train_corr, vmax=.8, square=True, annot=True)#画热力图   annot=True 显示系数

在这里插入图片描述
寻找K个与标签最相关的特征:

#寻找K个最相关的特征信息
k = 10 # number of variables for heatmap
cols = train_corr.nlargest(k, 'Diabetes_binary')['Diabetes_binary'].index

cm = np.corrcoef(train_data[cols].values.T)
hm = plt.subplots(figsize=(10, 10))#调整画布大小
#hm = sns.heatmap(cm, cbar=True, annot=True, square=True)
#g = sns.heatmap(train_data[cols].corr(),annot=True,square=True,cmap="RdYlGn")
hm = sns.heatmap(train_data[cols].corr(),annot=True,square=True)

plt.show()

在这里插入图片描述
寻找相关系数大于某个值的特征:

threshold = 0.1

corrmat = train_data.iloc[:,1:].corr()
top_corr_features = corrmat.index[abs(corrmat["Diabetes_binary"])>threshold]
plt.figure(figsize=(10,10))
g = sns.heatmap(train_data[top_corr_features].corr(),annot=True,cmap="RdYlGn")

在这里插入图片描述

可以直接用相关系数阈值来移除某些特征

# Threshold for removing correlated variables
threshold = 0.5

# Absolute value correlation matrix
corr_matrix = data_train1.corr().abs()
drop_col=corr_matrix[corr_matrix["target"]<threshold].index
data_all.drop(drop_col, axis=1, inplace=True)
  1. Box-Cox变换

线性回归基于正态分布,需要将数据转换使其符合正态分布。

# 1. 将训练集和测试集的特征变量合并 一起处理
train_x =  train_data.drop(['Diabetes_binary'], axis=1) # 训练集删除标签

#data_all=pd.concat([train_data,test_data],axis=0,ignore_index=True)
data_all = pd.concat([train_x,test_data]) # 合并训练集和测试集

#View data
data_all.head()

# 2. 归一化操作
# normalise numeric columns
cols_numeric=list(data_all.columns)

def scale_minmax(col):
    return (col-col.min())/(col.max()-col.min())

data_all[cols_numeric] = data_all[cols_numeric].apply(scale_minmax,axis=0)
data_all[cols_numeric].describe().T # 查看

特征工程

特征工程就是从原始数据提取特征的过程,这些特征可以很好的描述数据,并且利用特征建立的模型在未知数据上的性能表现可以达到最优。包括:特征使用、特征获取、特征处理、特征选择和特征监控。

处理流程:

  1. 去掉无用特征
  2. 去除冗余特征
  3. 对特征进行转换(数值化、归一化、类型转换)
  4. 对特征进行处理(异常值、最大值、最小值、缺失值)
  5. 符合模型的使用

总体可以分为:数据预处理、特征处理、特征选择。

数据预处理和特征处理:【机器学习】sklearn对数据预处理
(补用随机森林填补缺失值:【机器学习】集成学习(以随机森林为例))

特征选择:【机器学习】sklearn特征选择(feature selection)


总结

实际项目中:
在这里插入图片描述

  1. 通过数据探索可视化:
  • 找出异常值并进行处理,一些不符合常理的值,视业务逻辑而定。
  • 缺失值的处理,缺失很少的可以直接删除,其他的填均值、中位数、众数,或者使用逻辑森林来进行缺失值的填充
  • 数据处理:连续性(二值化与分段),分类型(编码与哑变量)

具体参考:

  • 【机器学习】sklearn对数据预处理
  • 【机器学习】集成学习(以随机森林为例) (看随机森林填充缺失值部分)
  1. 特征选择
  • 通过特征相关性,热力图,直接选择一些相关性较高的特征或者删除相关性不高的特征。
  • 过滤法,嵌入法,包装法来进行特征选择
  • 降维算法来达到特征选择的目的

具体参考:

  • 本文中数据探索部分热力图
  • 【机器学习】sklearn特征选择(feature selection)(过滤法,嵌入法,包装法)
  • 【机器学习】sklearn降维算法PCA

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32单片机智能小车一PWM方式实现小车调速和转向

目录 1. 电机模块开发 2. 让小车动起来 3. 串口控制小车方向 4. 如何进行小车PWM调速 5. PWM方式实现小车转向 1. 电机模块开发 L9110s概述 接通VCC&#xff0c;GND 模块电源指示灯亮&#xff0c; 以下资料来源官方&#xff0c;具体根据实际调试 IA1输入高电平&#xff…

第三方支付预付卡业务详解

第三方支付预付卡业务详解 第三方支付预付卡业务是指由第三方支付公司提供的一种预先充值后消费的支付方式。用户可以在第三方支付平台上购买预付卡&#xff0c;然后在指定的商户或者服务提供商那里进行消费。 运作模式&#xff1a; 1. 用户在第三方支付平台购买预付卡&#xf…

Elasticsearch(一)---介绍

简介 Elasticsearch是一个基于Lucene的实际的分布式搜索和分析引擎。设计用于云计算中&#xff0c;能够达到近实时搜索&#xff0c;稳定&#xff0c;可靠&#xff0c;快速&#xff0c;安装使用方便。基于RESTful接口。 官网地址&#xff1a;Elasticsearch 平台 — 大规模查找…

Linux MeterSphere测试平台远程访问你不会?来试试这篇文章

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网…

影响产品开发决策的认知偏见

认知偏见存在于每个人的内心&#xff0c;并在不断影响人们的工作和生活。认识并承认自己有偏见&#xff0c;并寻求相应的解决方案&#xff0c;可以帮助我们更好的做出产品决策、团队建设和架构设计。原文: The cognitive biases that influence product development decisions …

【c++|opencv】一、基础操作---2.图像信息获取

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像信息获取&#xff0c;roi 1. 图像信息获取 // 获取图像信息#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; …

QT-- out of memory, returning null image

提示&#xff1a;本文为学习内容&#xff0c;若有错误&#xff0c;请及时联系作者&#xff0c;谦虚受教 文章目录 前言一、崩溃信息二、错误原因1.QImage2.QStandardItemModel 三、问题解决总结 前言 学如逆水行舟&#xff0c;不进则退。 一、崩溃信息 崩溃信息: QImage: out…

学习Linux/GNU/C++/C过程中遇到的问题

学习Linux/GNU/C/C过程中遇到的问题 1.源函数调用&#xff1a;2.linux静态库使用&#xff1a;3.vscode创建c程序调用onnxruntime:问题1&#xff1a;找不到头文件或者未定义函数问题2:error while loading shared libraries: libonnxruntime.so.1.16.1: cannot open shared obje…

linux的使用学习(1)

Linux 修改root密码 1.以 root 用户或具有 sudo 权限的登录到 Linux 系统。 2.打终端&#xff0c;并执行以下命令以更改 root 用户的密码&#xff1a; sudo passwd root 3.然后&#xff0c;系统会要求你输入新的 root 密码。请注意&#xff0c;在输入密码时&#xff0c;终端界…

[毕设记录]@学术技能积累:zotero、readpaper 引用功能使用

文章目录 zoteroreadpaper 开题要在word里插入文献引用&#xff0c;zotero和readpaper在浏览器和word都有插件&#xff0c;比较好用 zotero Zotero 是一个免费、开源的参考文献管理软件&#xff0c;可以帮助用户收集、整理和引用文献。它支持多种操作系统&#xff0c;包括 Wind…

算法通关村第十二关黄金挑战——最长公共前缀问题解析

大家好&#xff0c;我是怒码少年小码。 最长公共前缀 LeetCode 14&#xff1a;编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”]输出&#xff…

网际协议IP

网际协议IP 一、IP地址 1、分类的IP地址 IP地址::{<网络号>,<主机号>} 2、无分类编址CIDR IP地址::{<网络前缀>,<主机号>} &#xff08;1&#xff09;网络前缀 ​ 与分类IP最大的区别就是网络前缀的位数n是不固定的&#xff0c;可以是0~32位。 ​ …

Day 11 python学习笔记

模块 内置模块 random random&#xff1a;随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法&#xff1a; random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…

Team AI:简化繁琐日常任务,打造团队智能协作

在过去的几个月里&#xff0c;我的同事们&#xff08;Thoughtworker&#xff09;一直在构建 Team AI 项目&#xff0c;一个围绕于 AIGC 辅助开发团队的野心勃勃的计划。在内部&#xff0c;我们还有一个名为 Team AI Hackathon 的活动&#xff0c;基于一个内部的 Team AI 代码库…

CCS3列表和超链接样式

在默认状态下&#xff0c;超链接文本显示为蓝色、下画线效果&#xff0c;当鼠标指针移过超链接时显示为手形&#xff0c;访问过的超链接文本显示为紫色&#xff1b;而列表项目默认会缩进显示&#xff0c;并在左侧显示项目符号。在网页设计中&#xff0c;一般可以根据需要重新定…

使用Llama index构建多代理 RAG

检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示&#xff0c;RAG为LLM提供了有用的上下文&#xff0c;以产生基于事实的输出。 但是现有的单代理RAG系统面临着检索效率低下、高延迟和次优提示的挑战。这些问题在…

答题小程序源码个人每日答题怎么做

答题小程序源码之个人每日答题怎么做 该模式以个人学习答题的方式进行答题&#xff0c;每人每天有X次答题机会&#xff0c;答对一题得X分&#xff0c;连续答对有额外奖励积分&#xff0c;每道题有倒计时X秒的思考时间。答题完成后领取本次的奖励积分。答题过程中如发现题目或答…

3D模拟场景开发引擎

在3D工程模拟开发中&#xff0c;有一些专门的引擎和工具可供选择&#xff0c;以帮助您创建逼真的三维模拟和模型。以下是一些用于3D工程模拟的开发引擎和工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

matlab 布尔莎七参数坐标转换模型

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫自重,把自己当个人。 一、算法原理 算法原理与实现代码已在免费文章:布尔莎七参数坐标转换模型一文中给出,不想看付费文章直接跳转即可。 二、代码实现 clc; clear; close all; %% --

C语言C位出道心法(一):基础语法

一:基础语法认知:|变量|常量|数据类型| 变量与常量,数据类型认知升维 C语言中各种变量的定义及数据类型的认知: 一般而言,在譬如C等高级编程语言中,我们定义不同的类型的变量,需要不同的数据类型来进行声明,不同类型的数据类型声明的变量占用的内存空间不一样; 而数据类型大致…