数据预处理和特征工程

2023-11-03

数据预处理:从数据中检测、纠正、删除损坏的不准确的或者不适用于模型记录的过程

           目的:让数据更加适应模型,匹配模型需求

特征工程:将原始数据转换为更能代表预测模型的潜在问题的特征工程。可以通过挑选最相关特征,提取特征以及创造特征来实现。其中创造特征又经常以将为的方式实现。

       问题:特征之间有相关性,特征和标签无关,特征太多或太少,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌。

       目的:降低计算成本,提升模型上限

数据预处理 :

数据无量钢化:将不同规格的数据转换为统一规格,或者是将不同分布的数据转换为某个特定分布的需求。

线性的无量纲化包括中心化处理(让所有的记录减去一个固定值)和缩放处理(除以一个固定值)

归一化(数据按最小值中心化,再按极差缩放,数据收敛到[0,1]之间)归一化后数据服从正态分布

          x^{*} =  \frac{x-min\left ( x \right )}{max\left ( x \right )-min\left ( x \right )}     使用preprocessing.MinMaxScaler来实现这个功能。

from sklearn.preprocessing import MinMaxScaler
import pandas as pd

data = [[-1,2],[-0.5,6],[0,10],[1,18]]
pd.DataFrame(data)
scaler = MinMaxScaler()          # 实例化
scaler = scaler.fit(data)        # 本质是生成min(x)和max(x)
result = scaler.transform(data)  # 通过接口导出结果
print(result)

 

result_ = scaler.fit_transform(data)     # 相当于print上两行的内容
print(result_)

 

a = scaler.inverse_transform(result)         # 将归一化后的结果逆转
print(a)

 

# 使用MinMaxScaler的参数feature_range实现归一化到[0,1]以外的范围

 

 # 当x中特征向量非常多的时候,fit会报错并表示数据量太大了计算不了

# 这时使用partial_fit作为训练接口

# scaler = scaler.paratial_fit (data)

使用numpy实现归一化

import numpy as np
# 归一化
x = np.array([[-1,2],[-0.5,6],[0,10],[1,18]])
x_nor = (x - x.min(axis=0))/(x.max(axis=0)-x.min(axis=0))
# axis 是以列计算
print(x_nor)
# 逆转归一化
x_return = x_nor * (x.max(axis=0)-x.min(axis=0)) + x.min(axis=0)
print(x_return)

 

 标准化(数据按均值中心化后,再按标准差缩放)数据服从均值为0,方差为1。

             x^{*} = \frac{x-\mu }{\sigma }       使用preprocessing.StandardScaler来实现这个功能。

from sklearn.preprocessing import StandardScaler

data = [[-1,2],[-0.5,6],[0,10],[1,18]]
scaler = StandardScaler()
a = scaler.fit_transform(data)   # fit本质是生成均值和方差
print(a)
b = scaler.inverse_transform(a)
print(b)

 

print(a.mean())     # 查看均值
print(a.std())      # 查看方差

MinMaxScaler 对异常值的敏感比较强,所以我们通常使用标准化 

处理缺失值

使用impute.SimpleImputer

参数 missing_values  告诉 SimpleImputer数据中缺失值长什么样,默认空值np.nan

        strategy 填补缺失值策略,默认是均值。

                 (数值型 mean 均值,median中值,

                    数值型和字符型  most_frequent众数,constant参考fill_value中的值) 

        fill_value 当参数strategy为constant时可用,可输入字符串或数字表示要填充的值。

        copy 默认为True 将创建特征矩阵的副本,反之则会将缺失值填补到原来的特征矩阵中。

import pandas as pd

data = pd.read_csv(r"F:\预处理数据\Narrativedata.csv",index_col=0)
# index_col=0 降第0列作为索引
data.head()

data.info()        # 探索数据

data.loc[:,"Age"]    # loc 使用索引的名字来进行切片

 

# 填补年龄

Age = data.loc[:,"Age"].values.reshape(-1,1)   # sklearn 中特征矩阵必须是二维 
Age[:10]

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer()        # 实例化,默认均值填补
imp_median = SimpleImputer(strategy="median")    # 用中位数填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0)   # 用0填补
imp_mean = imp_mean.fit_transform(Age)
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)
imp_mean[:10]

imp_median[:10]

 

imp_0[:10]

 # 因为不想年龄出现小数,而且因为29.699和28比较接近,所以我们用中位数来填补

data.loc[:,"Age"] = imp_median
data.info()

 

# 使用众数填补Embarked 

Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy = "most_frequent")
data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
data.info()

 使用numpy和pandas进行填补

import pandas as pd

data = pd.read_csv("F:\\预处理数据\\Narrativedata.csv")
data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
# .fillna 在DataFrame里面直接进行填补
print(data.loc[:,"Age"])

 删掉缺失值的行

data.dropna(axis=0,inplace=True)
newdata = data.dropna(axis=0,inplace=False)
# .dropna(axis=0)删除所有确实值的行,axis=1删除所有缺失值的列
# inplace为True表示在原数据上进行修改,False表示生成一个复制对象,不修改原数据,默认为False
print(data.info())

 先把Age补充上在删除Embarked缺失的两行

 

所有的行都由891变成了889 

处理分类特征:编码与哑变量

处理文字进行编码,把文字转换成数字

标签专用preprocessing.LabelEncoder

from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1]   
# 要输入的是标签,不是特征矩阵,所以可以一维
# 所有的行最后一列
le = LabelEncoder()
le = le.fit(y)
label = le.transform(y)
le.classes_     # 查看标签中有多少类别

label[0:20]

 

le.inverse_transform(label)[0:20]

data.iloc[:,-1] = label
data.head()

简单写法

from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])

特征专用 preprocessing.OrdinalEncoder :将分类特征转换为分类数值

from sklearn.preprocessing import OrdinalEncoder
newdata = data.copy()      # 保留原始data
OrdinalEncoder().fit(newdata.iloc[:,1:-1]).categories_
# iloc[行,列] 取中间两列所有的行
# categories_ 查看有多少类别

 

newdata.iloc[:,1:-1] = OrdinalEncoder().fit_transform(newdata.iloc[:,1:-1])
newdata.head()

 

独热编码,创建哑变量 preprocessing.OneHotEncoder

特征中只能有一种,存在一种有你就没我的不等概念

”S“   [ 0,                                ”S"   [[1,0,0],

”Q“    1,        转换成              "Q"   [0,1,0],

”R“    2]                                 "C"   [0,0,1]]

from sklearn.preprocessing import OneHotEncoder
x = data.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(x)
result = enc.transform(x).toarray()
# toarray 转化为一个数组
result
# 因为性别有两个类别,舱门有三个类别,所以输出有五个类别

# 还原
pd.DataFrame(enc.inverse_transform(result))
enc.get_feature_names()
# 返回每一个列的名字

# 把新的哑变量与原数据接起来
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)
# axis=1 表示跨行进行合并,把表左右进行相连,axis=0,表上下相连
newdata.head()

 

# 把原先两列删掉
newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
newdata.head()

 

# 改变列索引的名字
newdata.columns = ["Age","Survived",'female', 'male', 'C', 'Q', 'S']
newdata.head()

 

 处理连续性特征:二值化与分段

sklearn.preprocessing.Binarizer

二值化将特征值设为0或1,大于阈值为1,小于阈值为0

data1 = data.copy()
from sklearn.preprocessing import Binarizer    
x = data1.iloc[:,0].values.reshape(-1,1)
# 处理特征的必须是二维
transformer = Binarizer(threshold=30).fit_transform(x)
# threshold 阈值
data1.iloc[:,0] = transformer
data1.head()

 

 preprocessing.KBinsDiscretizer

将连续型变量划分为分类变量的类。将连续型变量排序后按顺序分箱后编码。

参数 n_bins 每个特征中分箱的个数,默认为5

        encode 默认onehot 做哑变量

                     ordinal 每个特征每个箱都被编码为一个整数,返回每一列是一个特征

        strategy用来定义箱宽

                    默认为quantile 等位分箱 每个特征中的每个箱内的样本数量相同

                    uniform 等宽分箱,每个特征中的每个箱最大值之间的差为

                                                        (特征.max()-特征.min())/(n_bins)

                    kmeans 聚类分箱每个箱中的值到最近的一维k均值聚类的簇心得到距离都相同

from sklearn.preprocessing import KBinsDiscretizer
x = data.iloc[:,0].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=3,encode='ordinal',strategy='uniform')
est.fit_transform(x)

 

set(est.fit_transform(x).ravel())
# ravel 降维  set 去掉重复

 

est = KBinsDiscretizer(n_bins=3,encode='onehot',strategy='uniform')
est.fit_transform(x).toarray()

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据预处理和特征工程 的相关文章

  • 使用 psycopg2 在 python 中执行查询时出现“编程错误:语法错误位于或附近”

    我正在运行 Python v 2 7 和 psycopg2 v 2 5 我有一个 postgresql 数据库函数 它将 SQL 查询作为文本字段返回 我使用以下代码来调用该函数并从文本字段中提取查询 cur2 execute SELECT
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from

随机推荐