cos大壮 2025-06-23 12:03 浙江
今儿和大家聊聊数据预处理方法
✨标准化旨在将数据转化为零均值和单位方差,适用于对距离敏感的算法,如SVM和KNN。通过sklearn库中的StandardScaler,可以轻松实现数据的标准化,并观察标准化前后数据分布的变化。
📏归一化将数据缩放到特定范围(通常是[0, 1]),加快梯度下降的收敛速度,适用于KNN和神经网络等需要计算距离的算法。通过MinMaxScaler可以实现归一化,并观察归一化后数据统计信息的改变。
📉主成分分析(PCA)是一种降维技术,通过将高维数据投影到低维空间,减少计算复杂度,并去除冗余特征。PCA的实现包括数据中心化、计算协方差矩阵、特征分解和降维。例如,通过PCA将Wine数据集降维至2维,并可视化降维结果。
🏷️标签编码将分类变量转换为整数,适用于有序类别数据,如学历。通过LabelEncoder,可以方便地将类别数据转换为数值型,并用于后续的模型训练。
💡独热编码将分类变量转换为二进制向量,消除类别之间的顺序关系,适用于无序类别数据,如性别。通过OneHotEncoder,可以将分类特征转化为独热编码,并避免模型引入虚假的顺序信息。
➕过采样通过复制少数类样本来平衡类别分布,提高分类模型对少数类的识别能力。SMOTE是常用的过采样方法,通过在少数类样本之间生成新样本来增加少数类样本数量。
⏱️滑动窗口在时间序列数据上提取固定大小的子序列,用于捕捉局部时间特征,适用于时间序列预测。通过定义窗口大小和步长,可以从时间序列数据中提取子序列。
🔄插值通过已知数据点估计未知数据点,用于填补缺失数据,提高数据集的完整性。线性插值是最简单的插值方法,通过连接已知数据点来估计缺失值。
➖降采样通过减少多数类样本来平衡类别分布,降低数据集的不平衡性。随机采样是最简单的降采样方法,从多数类中随机选择与少数类同等数量的样本。
🌟特征选择是选择数据集中最相关的特征,可以提高模型的泛化能力,减少过拟合。特征选择方法包括过滤式、包裹式和嵌入式,可以根据具体情况选择合适的方法。
cos大壮 2025-06-23 12:03 浙江
今儿和大家聊聊数据预处理方法
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 加载数据集
california = fetch_california_housing()
data = pd.DataFrame(california.data, columns=california.feature_names)
# 原始数据统计信息
print("原始数据统计信息:\n", data.describe())
# 标准化
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# 将标准化后的数据转为DataFrame
data_scaled = pd.DataFrame(data_scaled, columns=california.feature_names)
# 标准化后数据统计信息
print("标准化后数据统计信息:\n", data_scaled.describe())
# 可视化前后数据分布
plt.figure(figsize=(16, 6))
# 标准化前的分布
plt.subplot(1, 2, 1)
sns.histplot(data['MedInc'], kde=True, color='blue')
plt.title('Distribution of Median Income before Standardization')
# 标准化后的分布
plt.subplot(1, 2, 2)
sns.histplot(data_scaled['MedInc'], kde=True, color='red')
plt.title('Distribution of Median Income after Standardization')
plt.show()
Iris
数据集来展示归一化的效果,并生成相关的图表。from sklearn.datasets import load_iris
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 加载数据集
iris = load_iris()
data = pd.DataFrame(iris.data, columns=iris.feature_names)
# 原始数据统计信息
print("原始数据统计信息:\n", data.describe())
# 归一化
scaler = MinMaxScaler()
data_normalized = scaler.fit_transform(data)
# 将归一化后的数据转为DataFrame
data_normalized = pd.DataFrame(data_normalized, columns=iris.feature_names)
# 归一化数据统计信息
print("归一化后数据统计信息:\n", data_normalized.describe())
# 可视化前后数据分布
plt.figure(figsize=(16, 6))
# 归一化前的分布
plt.subplot(1, 2, 1)
sns.histplot(data['sepal length (cm)'], kde=True, color='green')
plt.title('Distribution of Sepal Length before Normalization')
# 归一化后的分布
plt.subplot(1, 2, 2)
sns.histplot(data_normalized['sepal length (cm)'], kde=True, color='orange')
plt.title('Distribution of Sepal Length after Normalization')
plt.show()
Wine
数据集来展示PCA的效果~from sklearn.datasets import load_wine
from sklearn.decomposition import PCA
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 加载数据集
wine = load_wine()
data = pd.DataFrame(wine.data, columns=wine.feature_names)
# 原始数据统计信息
print("原始数据统计信息:\n", data.describe())
# PCA降维至2维
pca = PCA(n_components=2)
data_pca = pca.fit_transform(data)
# 将PCA后的数据转为DataFrame
data_pca = pd.DataFrame(data_pca, columns=['PC1', 'PC2'])
# 可视化PCA结果
plt.figure(figsize=(10, 8))
sns.scatterplot(x='PC1', y='PC2', hue=wine.target, palette='bright', data=data_pca)
plt.title('PCA of Wine Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
import seaborn as sns
# 创建示例数据
data = pd.DataFrame({
'Education': ['High School', 'Bachelor', 'Master', 'PhD', 'Bachelor', 'High School', 'Master', 'PhD']
})
# 标签编码
label_encoder = LabelEncoder()
data['Education_encoded'] = label_encoder.fit_transform(data['Education'])
# 可视化标签编码结果
plt.figure(figsize=(8, 6))
sns.countplot(x='Education_encoded', data=data, palette='coolwarm')
plt.title('Label Encoded Education Levels')
plt.xlabel('Encoded Labels')
plt.ylabel('Count')
plt.show()
print("标签编码结果:\n", data)
Titanic
数据集中的性别特征来展示独热编码的效果~import pandas as pd
from sklearn.preprocessing import OneHotEncoder
import matplotlib.pyplot as plt
import seaborn as sns
# 创建示例数据
data = pd.DataFrame({
'Gender': ['Male', 'Female', 'Female', 'Male', 'Female', 'Male', 'Male', 'Female']
})
# 独热编码
onehot_encoder = OneHotEncoder(sparse=False)
gender_encoded = onehot_encoder.fit_transform(data[['Gender']])
# 将独热编码后的数据转为DataFrame
gender_encoded_df = pd.DataFrame(gender_encoded, columns=onehot_encoder.categories_[0])
# 可视化独热编码结果
plt.figure(figsize=(8, 6))
sns.heatmap(gender_encoded_df, annot=True, cbar=False, cmap='coolwarm')
plt.title('One-Hot Encoded Gender')
plt.xlabel('Gender')
plt.ylabel('Sample Index')
plt.show()
print("独热编码结果:\n", gender_encoded_df)
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
import matplotlib.pyplot as plt
import seaborn as sns
# 创建不平衡数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.9, 0.1], random_state=42)
# 使用SMOTE进行过采样
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
# 可视化过采样前后的数据分布
plt.figure(figsize=(16, 6))
# 过采样前
plt.subplot(1, 2, 1)
sns.scatterplot(X[:, 0], X[:, 1], hue=y, palette='coolwarm')
plt.title('Before SMOTE')
# 过采样后
plt.subplot(1, 2, 2)
sns.scatterplot(X_resampled[:, 0], X_resampled[:, 1], hue=y_resampled, palette='coolwarm')
plt.title('After SMOTE')
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 创建模拟的股票价格数据
np.random.seed(42)
time = np.arange(100)
price = np.sin(time / 10) + np.random.normal(scale=0.1, size=len(time))
data = pd.DataFrame({'Time': time, 'Price': price})
# 定义滑动窗口函数
def sliding_window(data, window_size):
return np.array([data[i:i + window_size] for i in range(len(data) - window_size + 1)])
# 设置窗口大小
window_size = 10
windows = sliding_window(data['Price'], window_size)
# 可视化滑动窗口结果
plt.figure(figsize=(16, 6))
for i, window in enumerate(windows[:5]):
plt.plot(range(i, i + window_size), window, marker='o')
plt.title('Sliding Window on Simulated Stock Price')
plt.xlabel('Time')
plt.ylabel('Price')
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
# 创建模拟的温度数据
np.random.seed(42)
time = np.arange(0, 100, 0.5)
temperature = np.sin(time) + np.random.normal(scale=0.1, size=len(time))
# 模拟缺失值
temperature[5:7] = np.nan
data = pd.DataFrame({'Time': time, 'Temperature': temperature})
# 线性插值
linear_interp = interp1d(data['Time'], data['Temperature'], kind='linear', fill_value="extrapolate")
time_new = np.arange(0, 100, 0.1)
temperature_linear = linear_interp(time_new)
# 可视化插值结果
plt.figure(figsize=(12, 6))
plt.plot(data['Time'], data['Temperature'], 'o', label='Original Data')
plt.plot(time_new, temperature_linear, '-', label='Linear Interpolation')
plt.title('Linear Interpolation of Simulated Temperature Data')
plt.xlabel('Time')
plt.ylabel('Temperature')
plt.legend()
plt.show()
from sklearn.datasets import make_classification
from imblearn.under_sampling import RandomUnderSampler
import matplotlib.pyplot as plt
import seaborn as sns
# 创建不平衡数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.9, 0.1], random_state=42)
# 使用随机降采样
undersampler = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = undersampler.fit_resample(X, y)
# 可视化降采样前后的数据分布
plt.figure(figsize=(16, 6))
# 降采样前
plt.subplot(1, 2, 1)
sns.scatterplot(X[:, 0], X[:, 1], hue=y, palette='coolwarm')
plt.title('Before Under-sampling')
# 降采样后
plt.subplot(1, 2, 2)
sns.scatterplot(X_resampled[:, 0], X_resampled[:, 1], hue=y_resampled, palette='coolwarm')
plt.title('After Under-sampling')
plt.show()
Breast Cancer
数据集来展示特征选择的效果~from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectKBest, chi2
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 加载数据集
cancer = load_breast_cancer()
data = pd.DataFrame(cancer.data, columns=cancer.feature_names)
# 使用卡方检验选择前10个最重要的特征
selector = SelectKBest(chi2, k=10)
selector.fit(data, cancer.target)
data_selected = data.iloc[:, selector.get_support(indices=True)]
# 可视化特征选择结果
plt.figure(figsize=(12, 6))
sns.barplot(x=data.columns[selector.get_support()], y=selector.scores_[selector.get_support()])
plt.title('Top 10 Features Selected by Chi-Square Test')
plt.xlabel('Features')
plt.ylabel('Chi-Square Score')
plt.xticks(rotation=90)
plt.show()
AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。
鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑