数据预处理-案例

该博客介绍了数据预处理的基本步骤,包括使用pandas和sklearn库处理缺失值(删除、填充),离群值检测(3σ原则、箱线图、LocalOutlierFactor),数据标准化(Z-score、MinMaxScaler、RobustScaler)以及特征编码(映射、LabelEncoder、OneHotEncoder)。此外,还涉及了离散化技术,如二值化、等距离和等频离散化。
摘要由CSDN通过智能技术生成

@数据预处理-案例

数据集来源:https://www.kaggle.com/artemskakun/snsdata
无标签数据

1、导包

import pandas as pd
import numpy as np
from pandas import cut  #等距离散化
from pandas import qcut  #等频离散化
from sklearn.preprocessing import Binarizer  #二值化
from sklearn.impute import SimpleImputer  #缺失值处理
from sklearn.neighbors import LocalOutlierFactor #离群处理
from sklearn.preprocessing import StandardScaler #标准化Z-score
from sklearn.preprocessing import MinMaxScaler #标准化
from sklearn.preprocessing import RobustScaler #标准化-离群值
from sklearn.preprocessing import OneHotEncoder #特征编码
from sklearn.preprocessing import LabelEncoder   #特征编码
import matplotlib.pyplot as plt  #画图工具
import warnings 
warnings.filterwarnings("ignore")  #不显示warning

2、读入数据

data=pd.read_csv("d:/datasets/snsdata.csv")  #美国高中生的社交数据
data1=data.copy()  #备份不同方法的练习需要

3、探索性分析

data.head()  #前5行
data.tail(8)  #后8行
data.sample(10) #随机取10行
data.info() 

<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 30000 entries, 0 to 29999 #样本总数
Data columns (total 40 columns): #特征总数
#Column Non-Null Count Dtype


0 gradyear 30000 non-null int64
#index 特征名 有效值 类型
1 gender 27276 non-null object

非数值型

2 age 24914 non-null float64

注:
有效值小于样本总数,有缺失。类型为object ,非数值需要编码

data.describe()

在这里插入图片描述
注:
显示数值类型列的统计特征(样本数、均值、标准差、最小、最大、分位数)。
非数值类型不显示

data.gender.value_counts()

在这里插入图片描述
注:显示非数值型特征的取值以及各值的个数。(F:有22054个样本。M:有5222个样本)

4、缺失值处理

删除

特征有效样本数少或对结果的影响很小可以考虑

data_new=data.dropna(axis=1,thresh=len(data)*.9)   #删除特征(其样本数小于数据集样本总数的90%)
data_new=data.dropna()   #删除有缺失值的样本
填充

对数值型数据可以采用均值填充、非数值型数据可以采用众数填充

imp_mean=SimpleImputer(missing_values=np.nan,strategy="mean")  #实例化SimpleImputer对象,均值填充
data["age_imp"]=imp_mean.fit_transform(data[["age"]])  #拟合填充,结果保存在数据集的新列上
imp_mode=SimpleImputer(missing_values=np.nan,strategy="most_frequent")  ##实例化SimpleImputer对象,众数填充
data["gender_imp"]=imp_mode.fit_transform(data[["gender"]])  #拟合填充,结果保存在数据集的新列上

data_new2=data.fillna(method="bfill")

5、离群值检测

mean_=data.friends.mean()
std_=data.friends.std()
data_n3=data[data.friends<mean_+3*std_][data.friends>mean_-3*std_]  #保留3西格玛内的样本
箱线图
data[["age"]].plot(kind="box",figsize=(5,6))

在这里插入图片描述

`
data[["drunk","shopping"]].plot(kind="box",figsize=(5,6))`

在这里插入图片描述

plt.boxplot(data[["drunk","shopping"]])

LocalOutlierFactor
from sklearn.neighbors import LocalOutlierFactor
lout=LocalOutlierFactor(n_neighbors=30,
algorithm="auto",  #auto,ball_tree kd_tree brute
leaf_size=20,
metric="minkowski",
p=2,
metric_params=None,
contamination=0.1,
n_jobs=1,
novelty=True
)
lout.fit(data[["friends"]])
data["friends_IO"]=lout.predict(data[["friends"]])
data[["friends_IO"]].value_counts() #查看离群值数量
data["nof"]=-lout.negative_outlier_factor_  #保存离群因子
data[["nof","friends","friends_IO"]][data["nof"]>1].sample(10)
#删除LOF>1.5的所有行
rows  = [x for x in data.index if data.loc[x]['nof']>1.5]  
data2 = data.drop(rows, axis=0)
#data2=data[data['nof']<1.5]

6、标准化

Z分数标准化
from sklearn.preprocessing import StandardScaler   #Z分数标准化
scaler1 = StandardScaler(copy=True)
scaler1.fit(data[["friends"]])
data["friends_Zstd"] = scaler.transform(data[["friends"]])
plt.hist(data[["friends"]],bins=25)#未标准化的friends数量分布

import seaborn as sns
sns.distplot(data["friends"])#未标准化的friends数量分布
sns.distplot(data["friends_StandardScaled"])#标准化后friends数量分布
#or
#data[["friends_StandardScaled"]].plot(kind="hist",bins=25,figsize=(25,5))

MinMaxScaler标准化
from sklearn.preprocessing import MinMaxScaler 
filtered_columns = ["friends"]
scaler = MinMaxScaler(copy=False)
scaler.fit(data[["friends"]])
data["friends_MM"]=scaler.transform(data[["friends"]])
data[["friends_MM"]] .plot(kind="hist",bins=25,figsize=(5,6))
RobustScaler标准化

from sklearn.preprocessing import RobustScaler
rob=RobustScaler(
with_centering=True, #如果为True,则在标准化之前将数据居中
with_scaling=True, #如果为True,则将数据缩放到分位数范围
quantile_range=(25.0, 75.0), #用于计算scale_的分位数范围
copy=True #如果为False,请尝试避免复制并改为直接替换
)
rob.fit(data[[“friends”]])
data[“rob”]=rob.transform(data[[“friends”]])
data[“rob”].plot(kind=“hist”,bins=25,figsize=(5,5))
在这里插入图片描述

7、编码

map
data["gender"]=data.gender.map({"F":0,"M":1,np.nan:0})
#data["gender"]=data.gender.map({"F":0,"M":1})   #无缺失数据或已处理
LabelEncoder
data=data1.copy()
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data["gender_le"]=le.fit_transform(data["gender"])) #编码
print(le.classes_)
get_dummy
df = pd.get_dummies(data, columns=['gender'])
df.head()

在这里插入图片描述

onehot
from sklearn.preprocessing import OneHotEncoder
OHE = OneHotEncoder(sparse=False)  #不压缩稀疏矩阵
data_gender=OHE.fit_transform(data[['gender']])  #对性别用OneHotEncoder进行编码

在这里插入图片描述

8、离散化

二值化
from sklearn.preprocessing import Binarizer
#二值化,阈值设置为10,返回值为二值化后的数据
Bir = Binarizer(threshold=10)
data["friends_Binarized"] = Bir.fit_transform(data[["friends"]])
data[["friends_Binarized","friends"]].head()
等距离散化
#等距离散化,各个类比依次命名Friends_Number_Label_0...
n=2
d1 = pd.cut(data["friends"], n, labels =["Friends_Number_Label_"+str(i) for i in range(n)])
等频离散化
n=2
d1 = pd.qcut(data["friends"], n, labels =["Friends_Number_Label_"+str(i) for i in range(n)])
K-means离散化
data_f = data[['friends']].copy().dropna()
n = 4
from sklearn.cluster import KMeans
kmodel = KMeans(n_clusters = n) #实例化
kmodel.fit(data_f) #fit模型
center_ = pd.DataFrame(kmodel.cluster_centers_).sort_values(0)  #输出聚类中心,并排序(按“0”特征升序)
l_ = center_.rolling(2).mean().iloc[1:] #移动平均求相邻两项中点,作为分界点
l_ = [data_f.min()[0]] + list(w[0]) + [data_f.max()[0]] #附加边界点
d2 = pd.cut(data_f["friends"], l_, labels =  ['friends_0','friends_1','friends_2','friends_3'],,include_lowest=True)
  • 3
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的数据预处理案例,假设我们有一个包含房屋面积、房间数、价格等信息的数据集,现在需要对数据进行预处理以便进行建模和分析。 1. 数据清洗 我们需要查看数据是否存在缺失值、异常值、重复值等问题,并对这些问题进行处理。 ```python import pandas as pd # 读取数据 data = pd.read_csv("house_data.csv") # 查看数据信息 print(data.info()) # 处理缺失值 data.dropna(inplace=True) # 处理异常值 data = data[(data['area'] > 0) & (data['rooms'] > 0) & (data['price'] > 0)] # 处理重复值 data.drop_duplicates(inplace=True) ``` 2. 数据变换 我们需要对数据进行归一化、标准化等操作,以便更好地进行分析和建模。 ```python from sklearn.preprocessing import MinMaxScaler, StandardScaler # 归一化 scaler1 = MinMaxScaler() data[['area', 'rooms']] = scaler1.fit_transform(data[['area', 'rooms']]) # 标准化 scaler2 = StandardScaler() data[['price']] = scaler2.fit_transform(data[['price']]) ``` 3. 特征选择 我们需要从原始数据集中选择最具有代表性的特征,以降低模型复杂度和提高模型的泛化能力。 ```python from sklearn.feature_selection import SelectKBest, f_regression # 特征选择 selector = SelectKBest(f_regression, k=2) X = data[['area', 'rooms']] y = data['price'] X_new = selector.fit_transform(X, y) ``` 4. 数据降维 我们可以使用主成分分析、线性判别分析等方法,将高维数据映射到低维空间中,以减少计算复杂度和提高模型的泛化能力。 ```python from sklearn.decomposition import PCA # 主成分分析 pca = PCA(n_components=2) X_new = pca.fit_transform(X) ``` 以上是一个简单的数据预处理案例,实际应用中需要根据具体的数据类型、分析需求和建模方法选择不同的处理方法和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITLiu_JH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值