数据清洗,非数值型变量怎么用于建模?OneHotEncoder

来自:宋天龙《PYTHON数据分析与数据化运营》,以下内容比较简陋,方便日后翻阅。

1.数据清洗

1.1 缺失值

针对缺失值的处理:丢弃、补全,可以用sklean中Imputer库

import pandas as pd  # 导入pandas库
import numpy as np  # 导入numpy库
from sklearn.impute import SimpleImputer  # 导入sklearn.preprocessing中的Imputer库# 生成缺失数据
df = pd.DataFrame(np.random.randn(6, 4), columns=['col1', 'col2', 'col3', 'col4'])  # 生成一份数据
df.iloc[1:2, 1] = np.nan  # 增加缺失值
df.iloc[4, 3] = np.nan  # 增加缺失值
print(df)
# 查看哪些值缺失
print('查看哪些值缺失')
nan_all = df.isnull()  # 获得所有数据框中的N值
print(nan_all)  # 打印输出
print('查看哪些列缺失')
# 查看哪些列缺失
nan_col1 = df.isnull().any()  # 获得含有NA的列
nan_col2 = df.isnull().all()  # 获得全部为NA的列
print(nan_col1)  # 打印输出
print(nan_col2)  # 打印输出

在这里插入图片描述
3种处理缺失值的方法:

# 丢弃缺失值
print('丢弃缺失值')
df2 = df.dropna()  # 直接丢弃含有NA的行记录
print(df2)  # 打印输出
print('使用sklearn将缺失值替换为特定值')
#此处也可以使用其他策略,众数、中位数等
nan_model = SimpleImputer(missing_values=np.nan, strategy='mean')  # 建立替换规则:将值为NaN的缺失值以均值做替换
nan_result = nan_model.fit_transform(df)  # 应用模型规则
print(nan_result)  # 打印输出
print('使用pandas将缺失值替换为特定值')
#此处也可以其他位置替代
nan_result_pd1 = df.fillna(method='backfill')  # 用后面的值替换缺失值
print(nan_result_pd1)  # 打印输出

在这里插入图片描述

1.2异常值

异常数据是数据分布的常态,处于特定分布之外的数据被定义为异常或噪音。
异常分两种:
伪异常:由业务特定运营动作造成的,是正常的业务规律。
真异常:数据本身的异常
下面用Z标准化检测异常


print('生成异常数据')
import pandas as pd 
df = pd.DataFrame({'col1': [1, 120, 3, 5, 2, 12, 13],
                   'col2': [12, 17, 31, 53, 22, 32, 43]})
print(df)  # 打印输出
# 通过Z-Score方法判断异常值
print('通过Z-Score方法判断异常值')
df_zscore = df.copy()  # 复制一个用来存储Z-score得分的数据框
cols = df.columns  # 获得数据框的列名
for col in cols:  # 循环读取每列
    df_col = df[col]  # 得到每列的值
    z_score = (df_col - df_col.mean()) / df_col.std()  # 计算每列的Z-score得分
    df_zscore[col] = z_score.abs() > 2.2  # 判断Z-score得分是否大于2.2,如果是则是True,否则为False
print(df_zscore)  # 打印输出
# 删除异常值所在的行
print('删除异常值所在的行')
df_drop_outlier = df[df_zscore['col1'] == False]
print(df_drop_outlier)

在这里插入图片描述

1.3 重复值

重复值处理

2.非数值型变量怎么用于建模?

非数值型变量主要分为:分类数据和顺序数据
分类数据是指某些属性只能归于某一类别的非数值型数据,例如性别:男、女,它们都是相同衡量维度上的不同属性分类。
顺序数据:只能归于某一有序类别的非数值型数据,例如:本科、硕士、博士。
上面的两种数据都需要用标志方法将它们转化为数值型变量才能参与模型的运算,除非某些模型允许非数值型变量存在,比如决策树。
转变方法:将所有分类或顺序变量的值域从一列多值的形态转化为多列只包含真值的形态。

下面用代码展示如何处理分类和顺序数据?

import pandas as pd  # 导入pandas库
from sklearn.preprocessing import OneHotEncoder  # 导入库# 生成数据
df = pd.DataFrame({'id': [3566841, 6541227, 3512441],
                   'sex': ['male', 'Female', 'Female'],
                   'level': ['high', 'low', 'middle'],
                   'score': [1, 2, 3]})
print(df)  # 打印输出原始数据框

在这里插入图片描述

# 使用sklearn进行标志转换
# 拆分ID和数据列
id_data = df[['id']]  # 获得ID列
raw_convert_data = df.iloc[:, 1:]  # 指定要转换的列
print(raw_convert_data)
# 将数值型分类向量转换为标志变量
model_enc = OneHotEncoder()  # 建立标志转换模型对象(也称为哑编码对象)
df_new2 = model_enc.fit_transform(raw_convert_data).toarray()  # 标志转换
# 合并数据
df_all = pd.concat((id_data, pd.DataFrame(df_new2)), axis=1)  # 重新组合为数据框
print(df_all)  # 打印输出转换后的数据框
# 使用pandas的get_dummies做标志转换
df_new3 = pd.get_dummies(raw_convert_data)
df_all2 = pd.concat((id_data, pd.DataFrame(df_new3)), axis=1)  # 重新组合为数据框
print(df_all2)  # 打印输出转换后的数据框

在这里插入图片描述

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值