使用 Python 提高数据清理技能的 7 种方法
通过修复无效条目、转换类型、编码变量、处理离群值、选择特征、缩放和填充缺失值来改进 Python 数据清理。
作者图片
清理数据是任何数据科学项目中最重要和最耗时的部分之一。
即使有最好的算法,您仍然需要干净的数据才能获得好的结果。
在这篇文章中,我将向您提供七个技巧,以提高您在 Python 中的数据清理能力。
1.处理无效数据条目
现实生活中的数据集通常包含无效的数据条目。为了避免损坏或意外值,应在进行任何分析之前更正这些值。
预测价格
我们将通过以下五种方式使用这个项目。 Haensel AMS 在数据科学家职位的招聘过程中使用了这个数据项目。 此处是此项目的链接。
应用
在我们的数据集中,loc1列包含意外的字符串值,例如 'S' 和'T',如果 loc1 预计为数字。
# Check for invalid entries in 'loc1'
df["loc1"].value_counts()
这是输出。
现在,让我们删除包含无效值的行。
# Remove rows with invalid 'loc1' values
df = df[(df["loc1"].str.contains("S") == False) & (df["loc1"].str.contains("T") == False)]
df.shape
这是输出。
让我们评估一下输出。
- 清洁前:value_counts() 输出显示 'S' 和'T' 在 loc1。
- 清理后:删除这些条目会将数据集大小从 10,000 行减少到 9,998 行。
- 影响:消除无效条目可确保错误数据不会影响后续分析和模型。
2.适当转换数据类型
使用的数据类型必须正确,以便后续进行具体操作。将数据转换为正确的类型提供了一种确保正确计算并防止错误的方法。
应用
loc1 和 loc2列最初的类型为对象,可能是由于前导零或非数字字符。需要将它们转换为数值类型进行分析。
这是代码。
df["loc2"] = pd.to_numeric(df["loc2"], errors='coerce')
df["loc1"] = pd.to_numeric(df["loc1"], errors='coerce')
df.dropna(inplace = True)
df.shape
这是输出。
让我们评估一下我们在这里做了什么。
- 转换后:转换为float64 或 int64 类型。
- 数据丢失:由于删除了不可转换值的行,数据集的大小略有减小(从 9,998 行减少到 9,993 行)。
- 影响:转换数据类型可以进行数值运算,对于建模至关重要。
3.编码分类变量
机器学习模型只能消耗数字输入。因此,分类值必须经过编码过程,将其转换为数字形式,这将保留其固有信息。
应用
道指(当天week) 列是分类值,例如 'Mon', 'Tue'等。您使用了两种方法来编码此数据:
- One-Hot 编码:为每个类别创建二进制列。
- 序数编码:将类别映射到数值。
让我们看一下示例。
One-Hot 编码
# Create dummy variables
dow_dummies = pd.get_dummies(df['dow'])
df = df.join(dow_dummies).drop('dow', axis=1)
df.head()
这是输出。
序数编码
# Map days of the week to numerical values
days_of_week = {'Mon': 1, 'Tue': 2, 'Wed': 3, 'Thu': 4, 'Fri': 5, 'Sat': 6, 'Sun': 7}
df['dow'] = df['dow'].map(days_of_week)
df.head()
这是输出。
让我们评估一下输出。
- One-Hot 编码:添加新列(周一、星期二等)使用二进制指标。
- 序数编码:替换dow值用数字表示。
- Impact:两种方法都将分类数据转换为适合建模的格式。当没有固有顺序时,one-hot 编码更可取,而序数编码则假定有顺序。
4.处理异常值
异常值可能会扭曲您的统计分析并毁掉您的模型。识别和控制异常值是平衡这种情况并提高结果稳健性的一种方法。
应用
让我们首先检查异常值。这是c
颂歌。
from pandas.plotting import scatter_matrix
# Suppress the output of the scatter_matrix function
_ = scatter_matrix(result.iloc[:,0:7], figsize=(12, 8))
这是输出。
让我们看看para1的值
result["para1"].value_counts()
这是输出。
我们发现para1列具有极值(例如 337),与其余数据相比,这些值属于离群值。让我们过滤此列。
# Analyze 'para1' value counts
print(result["para1"].value_counts())
# Remove outliers in 'para1'
result = result[result["para1"] < 10]
这是输出的评估。
- 删除之前:para1有值最多 337 个,而大多数条目在 0 到 7 之间。
- 删除后:带有 para1 的条目>= 10 被删除,减少数据集大小。
- 影响:删除异常值可以防止它们扭曲分析并提高模型性能。
5.基于相关性的特征选择
仅选择与目标变量高度相关的特征,这样可以提高模型的准确性并降低复杂性。
应用
您计算了特征与目标变量之间的相关性价格,选择最重要的特征。
five_best = []
df_5 = pd.DataFrame(result.corr()["price"]).sort_values(by = "price", ascending = False)
df_5 = df_5.drop(df_5.index[0]).head(5)
for i in range(len(df_5)):
five_best.append(df_5.index[i])
five_best
这是输出。
这是对我们所做工作的评估。
- 已识别的主要功能:['para2', 'para4', 'para3', 'para1', '周五]
- 影响:使用与价格相关性较高的特征可以提高模型的预测能力。
6.缩放功能
缩放可确保所有特征对模型训练过程做出同等贡献,这对于对特征缩放敏感的算法尤其重要。
缩放每个特征并确保所有特征对模型的贡献相同在机器学习中非常重要,特别是对于某些对不同比例的输入特征敏感的算法。
应用
我们应用了不同的缩放技术:
- 最小-最大缩放
- 标准缩放
- 稳健的扩展
那么,让我们看看他们的应用程序。
标准缩放示例
from sklearn.preprocessing import StandardScaler
# Separate features and target
X = result.drop('price', axis=1)
y = result['price']
# Apply Standard Scaling
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
让我们评估一下我们所做的事情。
- 模型性能:缩放改善了模型的训练和测试错误。
- 比较:您比较了不同缩放方法的性能。
- 影响:适当的缩放可以带来更快的收敛和更好的模型精度。
7.处理缺失值
机器学习模型可能因缺失值而变得古怪。填充意味着确保完全实现用于训练目的的集合。
基于综合数据集的模型构建
该数据项目已在 Capital One 数据科学职位的招聘过程中使用。这是链接。
应用
您的数据集包含多个要素的缺失值。为了保持数据完整性,您选择用每个特征的中值来填充这些缺失值。
首先,让我们检查缺失值。
# Check missing values in train_data
missing_train = train_data.isna().sum()
print("Missing values in train_data:")
print(missing_train[missing_train > 0])
# Check missing values in test_data
missing_test = test_data.isna().sum()
print("\nMissing values in test_data:")
print(missing_test[missing_test > 0])
这是输出。
现在,让我们看看将使用哪些代码来清理。
# Filling missing values in train_data with median
for column in train_data.columns:
median_value = train_data[column].median()
train_data[column].fillna(median_value, inplace=True)
# Filling missing values in test_data with median
for column in test_data.columns:
median_value = test_data[column].median()
test_data[column].fillna(median_value, inplace=True)
现在,我们再检查一次。这是代码。
# Check missing values in train_data
missing_train = train_data.isna().sum()
print("Missing values in train_data:")
print(missing_train[missing_train > 0])
# Check missing values in test_data
missing_test = test_data.isna().sum()
print("\nMissing values in test_data:")
print(missing_test[missing_test > 0])
这是输出。
让我们评估一下我们在这里做了什么。
- 插补之前:两个数据集中许多特征都缺少值。
- 插补后:所有缺失值均被填充;数据集完整。
- 影响:通过提供完整的训练和评估数据集来增强模型性能。
最终想法
在本文中,我们发现了七种关键的数据清理方法,它们将教您更多有关 Python 的知识并帮助您创建更好的模型。另外,请查看这些用于数据清理的Python库。
使用这些方法将极大地提高您的数据分析能力,尤其是在现实数据项目中。它还可以帮助您为数据科学家的招聘流程做好准备。