了解机器学习中的数据处理与分析
1. 处理缺失值:识别缺失值、不处理、删除、填充、异常值识别和处理。2. 数据类型转换:描述性变量转换为数值型、找到描述性变量、有序变量转换为数值型、无序变量转换为one-hot编码。3. 规范化数据:最小最大规范化、零均值规范化、扩展知识点:sklearn中的预处理方法。
目录
一、处理缺失值
在实际数据获取过程中,经常存在数据不完整、存在缺失的情况。为了更好地进行数据分析,通常需要对这些缺失数据进行有效识别和科学处理。
首先是我们如何查看数据是否有缺失值呢?
可以使用各种编程语言和工具中的函数或方法。在Python中,你可以使用Pandas库来加载数据,并使用isnull()或isna()方法来识别缺失值。下面是一个简单的示例:

针对缺失值问题,通常可采取以下三种处理方法:不处理、删除以及填充。
1. 不处理
部分算法对缺失值不敏感或者某些字段在结果分析中作用较小时,可以选择不处理缺失值。这种情况我们不需要额外的代码处理,直接将数据传递给模型即可。
2. 删除
当数据量较大,或者一条记录中存在多个字段缺失时,可以考虑删除含有缺失值的记录。以下是示例代码:
import pandas as pd
# 读取数据
data = pd.read_csv('your_dataset.csv')
# 检查是否有缺失值
missing_values = data.isnull().sum()
print("缺失值统计:")
print(missing_values)
# 删除含有缺失值的记录
data_cleaned = data.dropna()
# 打印清理后的数据
print("清理后的数据:")
print(data_cleaned)
3. 填充
为了减少信息的丢失,可以采用多种方法来填补缺失值。以下是几种常见的填充方法及其示例代码:
(1)固定值填充
使用一个固定值来填充所有缺失值。
import pandas as pd
# 读取数据
data = pd.read_csv('your_dataset.csv')
# 用固定值0填充缺失值
data_filled_fixed_value = data.fillna(0)
# 打印填充后的数据
print("用固定值填充后的数据:")
print(data_filled_fixed_value)
(2)中位数/均值插补
根据已有数据的中位数或均值来估算缺失值并进行填充。
import pandas as pd
# 读取数据
data = pd.read_csv('your_dataset.csv')
# 用中位数填充缺失值
data_filled_median = data.fillna(data.median())
# 打印填充后的数据
print("用中位数填充后的数据:")
print(data_filled_median)
(3)用前后数据填充
利用缺失值前后的数据信息进行插补。
import pandas as pd
# 读取数据
data = pd.read_csv('your_dataset.csv')
# 用前面的非缺失值填充缺失值
data_filled_ffill = data.fillna(method='ffill')
# 如果前面没有非缺失值,则用后面的非缺失值填充缺失值
data_filled_ffill_bfill = data_filled_ffill.fillna(method='bfill')
# 打印填充后的数据
print("用前后数据填充后的数据:")
print(data_filled_ffill_bfill)
(4)拉格朗日插值法
拉格朗日插值法特别适用于有序的数据集,如带有时间序列的数据集,且缺失值为连续型数值的小批量数据。
import pandas as pd
from scipy.interpolate import lagrange
# 读取数据
data = pd.read_csv('your_dataset.csv')
# 定义拉格朗日插值函数
def lagrange_interpolation(s, n, k=5):
y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))]
y = y[y.notnull()]
return lagrange(y.index, list(y))(n)
# 使用拉格朗日插值填充缺失值
for col in data.columns:
for i in range(len(data)):
if pd.isnull(data[col][i]):
data[col][i] = lagrange_interpolation(data[col], i)
# 打印填充后的数据
print("用拉格朗日插值法填充后的数据:")
print(data)
(5)其他插补方法
例如最近邻插补、回归方法、牛顿插值法、随机森林填充等,这些方法可以根据具体情况灵活选择和应用。这里以K近邻插补为例:
import pandas as pd
from sklearn.impute import KNNImputer
# 读取数据
data = pd.read_csv('your_dataset.csv')
# 创建KNN插补器
imputer = KNNImputer(n_neighbors=5)
# 使用KNN插补缺失值
data_filled_knn = pd.DataFrame(imputer.fit_transform(data), columns=data.columns)
# 打印填充后的数据
print("用KNN插补法填充后的数据:")
print(data_filled_knn)
通过这些方法,我们可以有效地处理数据中的缺失值,从而提高数据分析和建模的准确性。
二、处理异常值
异常值是指样本中的个别值,其数值明显偏离它所属样本的其余观测值。异常值有时是记录错误或者其它情况导致的错误数据,有时是代表少数情况的正常值
(一)异常值识别
1.描述性统计法
通过与业务或基本认知不符的数据来识别异常值。例如,年龄为负数是不合理的。
import pandas as pd
# 示例数据
data = pd.DataFrame({'Age': [25, 30, -5, 40, 35]})
# 识别年龄小于0的异常值
invalid_ages = data[data['Age'] < 0]
print("描述性统计法识别的异常值:")
print(invalid_ages)
2.三西格玛法
当数据服从正态分布时,99.7%的数值应该位于距离均值3个标准差之内的距离。
import pandas as pd
import numpy as np
# 示例数据
data = pd.DataFrame({'Value': np.random.normal(0, 1, 100)})
data.loc[101] = 10 # 添加一个异常值
# 计算均值和标准差
mean = data['Value'].mean()
std = data['Value'].std()
# 三西格玛范围
lower_bound = mean - 3 * std
upper_bound = mean + 3 * std
# 识别异常值
outliers = data[(data['Value'] < lower_bound) | (data['Value'] > upper_bound)]
print("三西格玛法识别的异常值:")
print(outliers)
3.箱型图
通过箱型图,可以利用四分位距(IQR)来识别异常值。
import pandas as pd
import numpy as np
# 示例数据
data = pd.DataFrame({'Value': np.random.normal(0, 1, 100)})
data.loc[101] = 10 # 添加一个异常值
# 计算IQR
q1 = data['Value'].quantile(0.25)
q3 = data['Value'].quantile(0.75)
iqr = q3 - q1
# IQR范围
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
# 识别异常值
outliers = data[(data['Value'] < lower_bound) | (data['Value'] > upper_bound)]
print("箱型图法识别的异常值:")
print(outliers)
4.其它
例如,基于聚类方法、基于密度的离群点检测、基于近邻度的离群点检测等。这里以DBSCAN(基于密度的聚类方法)为例:
import pandas as pd
import numpy as np
from sklearn.cluster import DBSCAN
# 示例数据
data = pd.DataFrame({'Value': np.random.normal(0, 1, 100)})
data.loc[101] = 10 # 添加一个异常值
# DBSCAN离群点检测
dbscan = DBSCAN(eps=0.5, min_samples=5)
data['cluster'] = dbscan.fit_predict(data[['Value']])
# 识别异常值(离群点被标记为-1)
outliers = data[data['cluster'] == -1]
print("DBSCAN法识别的异常值:")
print(outliers)
(二)异常值处理
对于异常值,可以删除,可以不处理,也可以视作缺失值进行处理。
import pandas as pd
import numpy as np
# 示例数据
data = pd.DataFrame({'Value': np.random.normal(0, 1, 100)})
data.loc[101] = 10 # 添加一个异常值
# 识别异常值(使用上文的IQR方法识别)
q1 = data['Value'].quantile(0.25)
q3 = data['Value'].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
outliers = data[(data['Value'] < lower_bound) | (data['Value'] > upper_bound)]
# 删除异常值
data_cleaned = data[(data['Value'] >= lower_bound) & (data['Value'] <= upper_bound)]
# 将异常值视作缺失值并填充
data_filled = data.copy()
data_filled.loc[(data['Value'] < lower_bound) | (data['Value'] > upper_bound), 'Value'] = np.nan
data_filled = data_filled.fillna(data_filled['Value'].mean())
print("删除异常值后的数据:")
print(data_cleaned)
print("填充异常值后的数据:")
print(data_filled)
三、如何进行数据类型转换
描述性变量转换为数值型
大部分机器学习算法要求输入的数据必须是数字,不能是字符串,这就要求将数据中的描述性变量(如性别)转换为数值型数据
1.找到描述性变量
import pandas as pd
# 示例数据
data = pd.DataFrame({'Gender': ['Male', 'Female', 'Male', 'Female'], 'Age': [25, 30, 35, 40]})
print("原始数据:")
print(data)
2.若变量是有序的
例如学历,从小学、初中、高中到大学研究生,其顺序是明确的。
import pandas as pd
# 示例数据
data = pd.DataFrame({'Education': ['Primary', 'Secondary', 'High School', 'University']})
# 定义有序分类
education_order = pd.CategoricalDtype(categories=['Primary', 'Secondary', 'High School', 'University'], ordered=True)
# 转换为有序数值型变量
data['Education'] = data['Education'].astype(education_order).cat.codes
print("有序变量转换后的数据:")
print(data)
3.变量是无序变量(one-hot)
import pandas as pd
# 示例数据
data = pd.DataFrame({'Gender': ['Male', 'Female', 'Male', 'Female'], 'Age': [25, 30, 35, 40]})
# One-Hot Encoding
data_encoded = pd.get_dummies(data, columns=['Gender'])
print("无序变量One-Hot编码后的数据:")
print(data_encoded)
四、将数据规范化
数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。一些需要数据规范化的算法:LR、SVM、KNN、KMeans、GBDT、AdaBoost、神经网络等
1.最小最大规范化
对原始数据进行线性变换,变换到[0,1]区间。计算公式为:
x* = (x-x.min)/(x.max-x.min)
import pandas as pd
# 示例数据
data = pd.DataFrame({'Value': [10, 20, 30, 40, 50]})
# 最小最大规范化
min_value = data['Value'].min()
max_value = data['Value'].max()
data['Value_normalized'] = (data['Value'] - min_value) / (max_value - min_value)
print("最小最大规范化后的数据:")
print(data)
2.零均值规范化
对原始数据进行线性变换,经过处理的数据的均值为0,标准差为1。计算方式是将特征值减去均值,除以标准差。计算公式为:x* = (x-x.mean)/σ
import pandas as pd
# 示例数据
data = pd.DataFrame({'Value': [10, 20, 30, 40, 50]})
# 零均值规范化
mean_value = data['Value'].mean()
std_value = data['Value'].std()
data['Value_normalized'] = (data['Value'] - mean_value) / std_value
print("零均值规范化后的数据:")
print(data)
五、数据分析
机器学习中的数据分析是一个非常重要的步骤,通常被称为数据探索性分析(Exploratory Data Analysis, EDA)。通过EDA,我们可以理解数据的基本特征,发现数据中的模式、异常值、缺失值等问题,从而为后续的建模和优化提供依据。
下面是进行数据分析的一些常见步骤和相关知识点,并附上相应的Python代码示例。我们将使用经典的Python库pandas和matplotlib,以及seaborn进行数据分析和可视化。
1. 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置绘图风格
sns.set(style="whitegrid")
2. 加载数据集
假设我们使用的是一个名为 data.csv 的数据集。
# 读取CSV文件
data = pd.read_csv('data.csv')
# 查看前几行数据
print(data.head())
3. 数据概览
获取数据的基本信息和统计描述。
# 查看数据的基本信息
print(data.info())
# 获取数据的基本统计量
print(data.describe())
4. 检查缺失值
了解数据中是否存在缺失值及其分布情况。
# 检查每列的缺失值数量
print(data.isnull().sum())
# 可视化缺失值情况
plt.figure(figsize=(10, 6))
sns.heatmap(data.isnull(), cbar=False, cmap='viridis')
plt.show()
5. 分析数据的分布
使用直方图、箱线图等方法查看变量的分布情况。
# 绘制数值型特征的直方图
data.hist(bins=30, figsize=(15, 10), edgecolor='black')
plt.show()
# 绘制箱线图
plt.figure(figsize=(12, 8))
sns.boxplot(data=data, orient="h")
plt.show()
6. 类别特征分析
如果数据中包含类别特征,可以使用计数图来分析类别分布。
# 类别型特征的计数图
categorical_cols = data.select_dtypes(include=['object']).columns
for col in categorical_cols:
plt.figure(figsize=(10, 6))
sns.countplot(y=col, data=data)
plt.title(f'Count of {col}')
plt.show()
7. 相关性分析
通过计算相关系数矩阵并绘制热力图来分析变量之间的相关性。
# 计算相关系数矩阵
corr_matrix = data.corr()
# 绘制热力图
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('Correlation Matrix')
plt.show()
8. 特征间关系分析
使用散点图、成对关系图等方法分析特征之间的关系。
# 绘制散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x='feature1', y='feature2', data=data)
plt.title('Scatter plot between feature1 and feature2')
plt.show()
# 成对关系图(适用于小数据集)
sns.pairplot(data)
plt.show()
9. 处理异常值
识别并处理数据中的异常值。
# 使用箱线图识别异常值
plt.figure(figsize=(12, 8))
sns.boxplot(data=data['numerical_feature'])
plt.show()
# 去除异常值(示例:去除箱线图上下四分位范围之外的数据)
Q1 = data['numerical_feature'].quantile(0.25)
Q3 = data['numerical_feature'].quantile(0.75)
IQR = Q3 - Q1
data_cleaned = data[~((data['numerical_feature'] < (Q1 - 1.5 * IQR)) | (data['numerical_feature'] > (Q3 + 1.5 * IQR)))]
10. 数据标准化/归一化
对于数值型特征,可以进行标准化或归一化处理。
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 标准化
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data.select_dtypes(include=[np.number]))
# 归一化
scaler = MinMaxScaler()
data_normalized = scaler.fit_transform(data.select_dtypes(include=[np.number]))
以上是数据分析的一些主要步骤和对应的Python代码示例。通过这些步骤,您可以更好地了解数据的结构和特征,为后续的机器学习模型构建做好准备。
六、扩展知识点
sklearn 中的预处理sklearn.preprocessing方法
sklearn.preprocessing
|
类 |
参数列表 |
特征 |
fit方法有用 |
说明 |
|
StandardScaler |
特征 |
无监督 |
Y |
标准化 |
|
MinMaxScaler |
特征 |
无监督 |
Y |
区间缩放 |
|
Normalizer |
特征 |
无信息 |
N |
归一化 |
|
Binarizer |
特征 |
无信息 |
N |
定量特征二值化 |
|
OneHotEncoder |
特征 |
无监督 |
Y |
定性特征编码 |
|
Imputer |
特征 |
无监督 |
Y |
缺失值计算 |
|
PolynomialFeatures |
特征 |
无信息 |
N |
多项式变换(fit方法仅仅生成了多项式的表达式 |
|
FunctionTransformer |
特征 |
无信息 |
N |
自定义函数变换(自定义函数在transform方法中调用 |
更多推荐



所有评论(0)