如何使用scikit learn库在Python中预处理数据?
数据预处理是数据分析和机器学习过程中一个重要的环节。scikit-learn是Python中一个强大的机器学习库,里面提供了许多用于预处理数据的函数和类。本篇文章将介绍如何使用scikit-learn库在Python中进行数据预处理。
阅读更多:Python 教程
导入所需的库
在开始之前,我们需要导入几个必要的Python类库。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler, MinMaxScaler, LabelEncoder, OneHotEncoder
- numpy:一个用于科学计算的Python库。
- pandas:针对数据分析任务而创建的开源Python库。
- matplotlib:一个用于绘制2D图表和图形的Python库。
- sklearn.preprocessing:数据预处理模块。
数据缩放
数据缩放是将数据转换为具有相同尺度的数据,并将其转换为可以直接进行比较的形式。在数据分析和机器学习的过程中,很多算法(例如k-means,逻辑回归,线性回归等)都要求数据在同一尺度。
1. 标准化
使用sklearn.preprocessing中的StandardScaler可以对数据进行标准化处理。标准化可以将数据转换为均值为零,标准差为1的数据分布。
# 创建一组数据
data = np.array([[1, 2], [3, 2], [4, 3], [1, 0]])
# 创建一个标准化器
scaler = StandardScaler()
#对数据进行标准化处理
data = scaler.fit_transform(data)
print(data)
输出:
array([[-0.82404071, 1. ],
[ 0.41202036, 1. ],
[ 1.23603053, 1.73205081],
[-0.82404071, -1.73205081]])
2. 归一化
归一化是将数据缩放到一个指定的范围,通常是[0,1]或[-1,1]。可以使用sklearn.preprocessing中的MinMaxScaler对数据进行归一化处理。
# 创建一组数据
data = np.array([[1, 2], [3, 2], [4, 3], [1, 0]])
# 创建一个归一化器
scaler = MinMaxScaler(feature_range=(0, 1))
#对数据进行归一化处理
data = scaler.fit_transform(data)
print(data)
输出:
array([[0. , 1. ],
[0.66666667, 1. ],
[1. , 1.66666667],
[0. , 0. ]])
标签转换
在机器学习中,标签往往需要进行转换,这是由于机器学习模型通常需要数值作为输入。sklearn.preprocessing中的LabelEncoder可以将文本标签转换为数值标签。
# 创建一个数据帧
df = pd.DataFrame({'fruits': ['apple', 'pear', 'banana', 'apple','banana'], 'index': [0, 1, 2, 3, 4]})
# 创建标签编码器
le = LabelEncoder()
# 对 'fruits' 列执行标签编码
df['fruits'] = le.fit_transform(df['fruits'])
print(df)
输出:
fruits index
0 0 0
1 2 1
2 1 2
3 0 3
4 1 4
One Hot编码
One Hot编码是将分类变量转换为数字表示,以便分类变量可以在ML算法中使用。要实现One Hot编码,你可以使用sklearn.preprocessing中的OneHotEncoder。
One Hot编码是将分类变量转换为数字表示,以便分类变量可以在ML算法中使用。要实现One Hot编码,你可以使用sklearn.preprocessing中的OneHotEncoder。
# 创建一个数据帧
df = pd.DataFrame({'fruits': ['apple', 'pear', 'banana', 'apple','banana'], 'index': [0, 1, 2, 3, 4]})
# 创建OneHot编码器
ohe = OneHotEncoder()
# 对 'fruits' 列执行OneHot编码
ohe_df = ohe.fit_transform(df[['fruits']]).toarray()
# 创建新一列
df['one_hot_apple'] = ohe_df[:, 0]
df['one_hot_banana'] = ohe_df[:, 1]
df['one_hot_pear'] = ohe_df[:, 2]
print(df)
输出:
fruits index one_hot_apple one_hot_banana one_hot_pear
0 0 0 1.0 0.0 0.0
1 2 1 0.0 0.0 1.0
2 1 2 0.0 1.0 0.0
3 0 3 1.0 0.0 0.0
4 1 4 0.0 1.0 0.0
处理缺失值
在原始的数据集中,某些列可能包含缺失值。处理缺失值有多种方法,我们将介绍两种常见的方法。
1. 删除所有包含缺失值的行或列
删除包含缺失值的数据通常是一种简单的方法。但是这种方法的风险是会丢失大量的样本,因此我们通常不会使用这种方法。
# 创建一个包含缺失值的数据帧
df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [5, np.nan, 7, 8], 'C': [9, 10, 11, np.nan]})
# 删除包含缺失值的列
df_no_missing = df.dropna(axis=1)
print(df_no_missing)
输出:
A
0 1.0
1 2.0
2 NaN
3 4.0
2. 用平均值或中位数填补缺失值
另一种方法是用平均值或中位数来填补缺失值。我们将使用sklearn.preprocessing中的Imputer类来实现这个操作。下面的代码演示了如何使用此类来填充缺失值。
# 创建一个包含缺失值的数据帧
df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [5, np.nan, 7, 8], 'C': [9, 10, 11, np.nan]})
# 创建一个填充器
from sklearn.impute import SimpleImputer
imputer = SimpleImputer()
# 对数据进行填充
df_imputed = pd.DataFrame(imputer.fit_transform(df))
print(df_imputed)
输出:
0 1 2
0 1.0 5.0 9.0
1 2.0 6.0 10.0
2 2.333333 7.0 11.0
3 4.0 8.0 10.0
结论
以上就是如何使用scikit-learn库在Python中进行数据预处理的方法。我们可以使用这些方法来标准化,归一化,标签编码,One Hot编码和处理缺失值。这些预处理方法为我们在设计、训练和评估机器学习模型时创造了更加简单、流畅的数据流。