目录

一、处理缺失值

1. 不处理

2. 删除

3. 填充

(1)固定值填充

(2)中位数/均值插补

(3)用前后数据填充

(4)拉格朗日插值法

(5)其他插补方法

二、处理异常值

(一)异常值识别

1.描述性统计法

2.三西格玛法

3.箱型图

4.其它

(二)异常值处理

三、如何进行数据类型转换

1.找到描述性变量

2.若变量是有序的

3.变量是无序变量(one-hot)

四、将数据规范化

1.最小最大规范化

2.零均值规范化

五、数据分析

1. 导入必要的库

2. 加载数据集

3. 数据概览

4. 检查缺失值

5. 分析数据的分布

6. 类别特征分析

7. 相关性分析

8. 特征间关系分析

9. 处理异常值

10. 数据标准化/归一化

六、扩展知识点

一、处理缺失值

在实际数据获取过程中,经常存在数据不完整、存在缺失的情况。为了更好地进行数据分析,通常需要对这些缺失数据进行有效识别和科学处理。

首先是我们如何查看数据是否有缺失值呢?

可以使用各种编程语言和工具中的函数或方法。在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方法中调用

Logo

一站式 AI 云服务平台

更多推荐