机器学习预处理

news2024/9/21 4:22:40

一、数据读取

数据的读取方式有多种,最终我们可以转化为numpy和pandas形式储存,方便后续的模型建立。

1.1 读取库的安装

需要用到的三个库
pip install pandas
pip install numpy
pip install openpyxl

1.2 库的使用

import pandas as pd
​
#### 1、CSV文件读取
​
path=r"data.csv"   # 获取CSV数据文件的绝对路径(相对路径)
data = pd.read_csv(path)
​
#### 2、 xlsx文件读取
​
data = pd.read_excel(path)

1.3 txt文本读取

1、逐行读取文本文件
file_path = 'data.txt'  # 文本文件路径]()
​
with open(file_path, 'r') as file:
    for line in file:
        print(line)

在上述示例中,我们首先指定了文本文件的路径 file_path。然后使用 open() 函数打开文件,并指定模式为 ‘r’(只读模式)。通过 with 语句,可以确保在处理完成后自动关闭文件。然后,使用 for 循环逐行读取文件内容,并打印每行。

2、读取整个文本文件内容
file_path = 'data.txt'  # 文本文件路径
with open(file_path, 'r') as file:
    content = file.read()
print(content)

在上述示例中,我们使用 read() 方法将整个文本文件内容读取到变量 content 中。然后,我们打印 content,显示文件的全部内容。

二、数据处理

在获取数据之后,通常需要进行一系列的数据处理步骤以准备数据进行分析或建模。以下是一些常见的数据处理步骤:

数据清洗(Data Cleaning):检查和处理数据中的缺失值、异常值或错误数据。这可能涉及到填充缺失值、删除重复数据、纠正错误数据等。

数据转换(Data Transformation):对数据进行转换,使其适应特定的分析需求或算法。例如,对数值型数据进行标准化或归一化,对类别型数据进行编码(如独热编码),对文本数据进行分词或向量化等。

特征选择(Feature Selection):从原始数据中选择最相关或最有用的特征,以降低维度和提高模型的效果。可以使用统计方法(如方差阈值、卡方检验)或机器学习方法(如基于模型的特征选择)来进行特征选择。

特征工程(Feature Engineering):根据领域知识或数据理解,创建新的特征以增强模型的表现。这可以包括生成交互特征、多项式特征、时间序列特征等。

数据集平衡(Data Balancing):处理不均衡数据集的问题,以确保对于分类或回归任务,各类别样本的比例合理。可以使用欠采样、过采样等方法来平衡数据集。

数据集合并(Data Integration):将来自不同数据源的数据进行合并,以建立更完整和综合的数据集。这可能涉及到表的连接、合并或拼接操作。

数据降维(Dimensionality Reduction):数据降维是减少数据集维度的过程,旨在去除冗余特征、提高计算效率、减少存储空间、避免维度灾难以及改善模型表现。

数据集划分(Data Splitting):将数据集划分为训练集、验证集和测试集。训练集用于模型训练,验证集用于调参和模型选择,测试集用于评估模型的性能。

2.1 数据清洗(Data Cleaning)

2.1.1 统计缺失值

import pandas as pd
import numpy as np
​
# 创建包含缺失值的 DataFrame 示例
​
data = {'A': [1, 2, None, 4, 5],
        'B': ['a', 'b', None, 'd', 'e'],
        'C': ['x', None, 'z', None, 'w']}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
​
print("\n")
​
# 检查列中的缺失值数量
​
missing_values = df.isnull().sum()
print(missing_values)

2.1.2 删除缺失值

# 删除包含缺失值的行
​
df_cleaned = df.dropna(axis=0)
print(df_cleaned)
​
# 删除包含缺失值的列(适用于缺失占比过大情形下)
​
df_cleaned2 = df.dropna(axis=1)
print(df_cleaned2)

2.1.3 填充缺失值

​
​
# 使用均值填充缺失值
​
df_filled = df.fillna(df.mean())
print("\n使用均值填充缺失值后的 DataFrame:")
print(df_filled)
​
# 使用众数填充缺失值
​
df_filled = df.fillna(df.mode().iloc[0])
print("\n使用众数填充缺失值后的 DataFrame:")
print(df_filled)

2.1.4 使用3σ原则剔除异常值

import pandas as pd
import numpy as np
​
# 创建包含异常值的 DataFrame 示例
​
data = {'A': [11,11,11,12,12,12,13,13,13,14,14,14,14,13,13,13,12,12,12,11,11,11,-9999999],
        'B': [101,101,101,102,102,102,103,103,103,104,104,104,104,103,103,103,102,102,102,101,101,101,-9999999]}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
print("\n")
​
# 使用3σ原则剔除异常值
​
mean = df.mean()  # 每列的均值
std = df.std()    # 每列的方差
threshold = 3
df_cleaned = df[(df - mean).abs() < threshold * std]
df_cleaned = df_cleaned.dropna()  # 剔除包含缺失值的行
print("\n使用3σ原则剔除异常值后的 DataFrame:")
print(df_cleaned)

在这个示例中,我们首先计算了每列的均值 (mean) 和标准差 (std)。然后,我们根据3σ原则,筛选出与均值差距超过3倍标准差的数据点,并将它们剔除。为了剔除包含缺失值的行,我们使用了 dropna() 方法。在这个例子中,异常值-9999999被正确地剔除了。

2.1.5重复观测处理

import pandas as pd
import numpy as np
​
data=pd.DataFrame([[8.3,6],[9.3,4],[6,8],[3,1],[3,1]])
​
# 重复观测的检测 
​
print('数据集中是否存在重复观测:\n',any(data.duplicated()))
​
# 删除重复项 
​
data.drop_duplicates(inplace = True)
​
# 重复观测的检测 
​
print('数据集中是否存在重复观测:\n',any(data.duplicated()))
print(data)

2.1.6缺失值处理

一般而言,当遇到缺失值(Python中用NaN 表示)时,可以采用三 种方法处置,分别是删除法、替换法和插补法。

删除法
import pandas as pd
import numpy as np
​
data=pd.DataFrame([[8.3,6,],[9.3,4,],[6,8,8],[5,6],[3,1,8]],columns=('a','b','c'))
​
# 缺失观测的检测 
​
print('数据集中是否存在缺失值:\n',any(data.isnull()))
print(data)
​
​
# 删除法之变量删除
​
data.drop(["c"],axis =1 ,inplace=True)
print(data)

删除法之记录删除
data=data.dropna(axis=0,how='any')

解析:

1、删除全为空值的行或列

  data=data.dropna(axis=0,how='all')   #行
​
  data=data.dropna(axis=1,how='all')   #列

2、删除含有空值的行或列

 data=data.dropna(axis=0,how='any')   #行
​
data=data.dropna(axis=1,how='any')   #列

函数具体解释:

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) 函数作用:删除含有空值的行或列

axis:维度,axis=0表示index行,axis=1表示columns列,默认为0

how:"all"表示这一行或列中的元素全部缺失(为nan)才删除这一行或列,"any"表示这一行或列中只要有元素缺失,就删除这一行或列

thresh:一行或一列中至少出现了thresh个才删除。

subset:在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有axis决定是行还是列)

inplace:刷选过缺失值得新数据是存为副本还是直接在原数据上进行修改。

替换法
# 替换法之前向替换
​
#data.fillna(method = 'ffill')
​
# 替换法之后向替换
​
#data.fillna(method = 'bfill')
#替换法之补平均数
#data['c']=data['c'].fillna(data['c'].mean())
#替换法之补众数
#data['c']=data['c'].fillna(data['c'].mode())
#替换法之补中位数
data['c']=data['c'].fillna(data['c'].median())
print(data)
插补法

插值法是利用已知点建立合适的插值函数,未知值由对应点xi求出的函数值f(xi)近似代替

1、拉格朗日插值法

2、牛顿插值法

3、异常值处理 4、特征编码处理 5、特征创建

2.2 数据转换(Data Transformation)

2.2.1 标准化(Normalization)

标准化是一种常见的数据转换方法,旨在将数值型数据缩放到相同的范围,以消除不同特征之间的量纲差异。常用的标准化方法包括Z-score标准化和最小-最大标准化。

import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
​
# 创建包含数值型数据的DataFrame示例
​
data = {'A': [10, 20, 30, 40, 50],
        'B': [2, 4, 6, 8, 10]}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
​
# 使用Z-score标准化
​
scaler = StandardScaler()
df_normalized = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print("\nZ-score标准化后的 DataFrame:")
print(df_normalized)
​
# 使用最小-最大标准化
​
min_max_scaler = MinMaxScaler()
df_normalized_minmax = pd.DataFrame(min_max_scaler.fit_transform(df), columns=df.columns)
print("\n最小-最大标准化后的 DataFrame:")
print(df_normalized_minmax)

2.2.2 编码(Encoding)

编码用于将类别型数据转换为适用于机器学习算法的数值型数据。常用的编码方法包括独热编码和标签编码。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
​
# 创建包含类别型数据的DataFrame示例
​
data = {'A': ['红', '蓝', '绿', '绿', '红'],
        'B': ['大', '小', '中', '大', '中']}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
# 使用独热编码
​
encoder = OneHotEncoder(sparse=False)
df_encoded = pd.DataFrame(encoder.fit_transform(df), columns=encoder.get_feature_names_out())
print("\n独热编码后的 DataFrame:")
print(df_encoded)
​
# 使用标签编码
​
label_encoder = LabelEncoder()
df_encoded_label = df.apply(label_encoder.fit_transform)
print("\n标签编码后的 DataFrame:")
print(df_encoded_label)
​

2.2.3 文本向量化(Text Vectorization)

文本向量化是将文本数据转换为数值型数据的过程。常见的文本向量化方法包括词袋模型和TF-IDF模型。

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
​
##### 创建包含文本数据的DataFrame示例
data = {'text': ['我 爱 中国', '中国 拥有 众多 历史 名胜', '我 喜欢 吃 中国 菜']}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
​
# 使用词袋模型进行文本向量化
​
vectorizer = CountVectorizer()
df_vectorized = pd.DataFrame(vectorizer.fit_transform(df['text']).toarray(), columns=vectorizer.get_feature_names_out())
print("\n词袋模型向量化后的 DataFrame:")
print(df_vectorized)
​
# 使用TF-IDF模型进行文本向量化
​
tfidf_vectorizer = TfidfVectorizer()
df_tfidf = pd.DataFrame(tfidf_vectorizer.fit_transform(df['text']).toarray(), columns=tfidf_vectorizer.get_feature_names_out())
print("\nTF-IDF模型向量化后的 DataFrame:")
print(df_tfidf)

2.3删减特征

去除唯一属性

唯一属性通常是一些id属性,这些属性并不能刻画样本自身的分布规律,所以简单地删除这些属性即可。

2.4数据查看

查看行列: data.shape 查看数据详细信息: data.info(),可以查看是否有缺失值 查看数据的描述统计分析: data.describe(),可以查看到异常数据 获取前/后10行数据: data.head(10)、data.tail(10) 查看列标签: data.columns.tolist() 查看行索引: data.index 查看数据类型: data.dtypes 查看数据维度: data.ndim 查看除index外的值: data.values,会以二维ndarray的形式返回DataFrame的数据 查看数据分布(直方图): seaborn.distplot(data[列名].dropna())

2.5特征缩放

2.5.1为什么要特征数据缩放?

有特征的取值范围变化大,影响到其他的特征取值范围较小的,那么,根据欧氏距离公式,整个距离将被取值范围较大的那个特征所主导。

为避免发生这种情况,一般对各个特征进行缩放,比如都缩放到[0,1],以便每个特征属性对距离有大致相同的贡献。

作用:确保这些特征都处在一个相近的范围。

优点:1、这能帮助梯度下降算法更快地收敛,2、提高模型精

直接求解的缺点: 1、当x1 特征对应权重会比x2 对应的权重小很多,降低模型可解释性 2、梯度下降时,最终解被某个特征所主导,会影响模型精度与收敛速度 3、正则化时会不平等看待特征的重要程度(尚未标准化就进行L1/L2正则化是错误的)

哪些机器学习算法不需要(需要)做归一化?

概率模型(树形模型)不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、RF。而像Adaboost、SVM、LR、Knn、KMeans之类的最优化问题就需要归一化。

2.5.2特征缩放常用的方法

1、归一化(Normalization) 数值的归一,丢失数据的分布信息,对数据之间的距离没有得到较好的保留,但保留了权重。 1.小数据/固定数据的使用;2.不涉及距离度量、协方差计算、数据不符合正态分布的时候;3.进行多指标综合评价的时候。 将数值规约到(0,1)或(-1,1)区间。

一个特征X的范围[min,max]

import pandas as pd
import numpy as np
​
data=pd.DataFrame([[8.3,6],[9.3,4],[6,8],[3,1]])
print(data)
​
data[0]=(data[0]-data[0].min())/(data[0].max()-data[0].min())
data[1]=(data[1]-data[1].min())/(data[1].max()-data[1].min())
print(data)

2、标准化(Standardization) 数据分布的归一,较好的保留了数据之间的分布,也即保留了样本之间的距离,但丢失了权值 1.在分类、聚类算法中,需要使用距离来度量相似性;2.有较好的鲁棒性,有产出取值范围的离散数据或对最大值最小值未知的情况下。 将数据变换为均值为0,标准差为1的分布切记,并非一定是正态的。

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

import numpy as np
from sklearn.preprocessing import StandardScaler
​
data=np.array([[2,2,3],[1,2,5]])
print(data)
print()
​
scaler=StandardScaler()
# fit函数就是要计算这两个值
​
scaler.fit(data)
​
# 查看均值和方差
​
print(scaler.mean_)
print(scaler.var_)
​
# transform函数则是利用这两个值来标准化(转换)
​
X=scaler.transform(data)
print()
print(X)

这两组数据的均值是否为0,方差(σ2)是否为1

相同点及其联系 归一化广义上是包含标准化的,以上主要是从狭义上区分两者。本质上都是进行特征提取,方便最终数据的比较。都是为了缩小范围,便于后续的数据处理。 加快梯度下降,损失函数收敛; 提升模型精度; 防止梯度爆炸(消除因为输入差距过大而带来的输出差距过大,进而在反向传播的过程当中导致梯度过大,从而形成梯度爆炸)

2.6 特征选择(Feature Selection)

当涉及到特征选择时,Python中有多个库和方法可供选择。以下是使用几种常见的特征选择方法的示例。

2.6.1 方差阈值法(Variance Threshold Method)

方差阈值法用于检测具有低方差的特征并将其删除。这种方法适用于大多数特征都有相似方差的情况。在sklearn库中,可以使用VarianceThreshold类来实现方差阈值特征选择。

from sklearn.feature_selection import VarianceThreshold
​
data = pd.read_csv(r"IRIS.csv")
print(data.head()) # 输出数据的前几行查看
X = data[['Sepal.Length', 'Sepal.Width', 'Petal.Length','Petal.Width']]# 选取所有的特征列
y = data["Species"] # 选取因变量(也就是要预测的目标变量)
​
# 创建VarianceThreshold对象,设置方差阈值
​
selector = VarianceThreshold(threshold=0.2)
​
# 使用fit_transform方法选择特征
​
new_features = selector.fit_transform(X)
​
# 输出选择的特征
​
selected_features = X.columns[selector.get_support()]
print("Selected Features:", selected_features)

2.6.2 单变量特征选择(Univariate Feature Selection)

from sklearn.feature_selection import VarianceThreshold, SelectKBest, f_classif
​
#基于统计方法的单变量特征选择
selector = SelectKBest(score_func=f_classif, k=2)
X_univariate = selector.fit_transform(X, y)
​
# 打印使用单变量特征选择后的特征维度
​
print("单变量特征选择后的特征维度:", X_univariate.shape[1])

基于统计方法的单变量特征选择则使用统计检验方法来计算每个特征与目标变量之间的关联程度,选择最相关的特征。在示例代码中,我们使用F值作为评分函数,并选择k个最好的特征(k=2)。通过SelectKBest(score_func=f_classif, k=2)来实现特征选择,同样使用fit_transform方法得到经过特征选择后的数据集X_univariate。

最后,使用shape[1]打印特征选择后的数据集的特征维度,可以观察到经过特征选择后的结果。

2.6.3 基于模型的特征选择(Model-based Feature Selection)

基于模型的特征选择方法通过训练一个机器学习模型并使用模型的特征重要性或系数来选择最相关的特征。这个示例使用随机森林模型来进行特征选择。

from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
​
# 创建随机森林分类器作为模型
​
model = RandomForestClassifier()
​
# 使用SelectFromModel选择特征,设置阈值为"median"
​
selector = SelectFromModel(model, threshold="median")
​
# 使用fit_transform方法选择特征
​
new_features = selector.fit_transform(X, y)
​
# 输出选择的特征
​
selected_features = X.columns[selector.get_support()]
print("Selected Features:", selected_features)

2.6.4 基于模糊粗糙集的属性约简(特征选择)

保持分类能力不变的前提下,通过知识简约,导出问题的决策或分类规则。

2.7 特征工程(Feature Engineering)

2.7.1 生成交互特征(Interaction Features)

交互特征是通过将不同特征之间的乘积或其他数学操作组合在一起创建的新特征。以鸢尾花数据集中,我们可以将花萼长度(sepal length)和花瓣宽度(petal width)相乘创建一个交互特征。

import pandas as pd
​
# 生成交互特征: 花萼长度与花瓣宽度的乘积
​
data['interaction_feature'] = data['Sepal.Length'] * data['Petal.Width']
​
# 查看新特征
​
print(data.head())

2.7.2 多项式特征(Polynomial Features)

多项式特征通过对原始特征进行多项式扩展来创建新的特征。在鸢尾花数据集中,我们可以使用PolynomialFeatures类来生成原始特征的高阶多项式特征。

from sklearn.preprocessing import PolynomialFeatures
​
# 创建PolynomialFeatures对象,设置多项式阶数为2
​
poly_features = PolynomialFeatures(degree=2)
​
# 生成多项式特征
​
X_poly = poly_features.fit_transform(X)
​
# 将生成的多项式特征转换为DataFrame
​
df_poly = pd.DataFrame(X_poly, columns=poly_features.get_feature_names_out())
​
# 查看新特征
​
print(df_poly)

2.7.3 时间序列特征(Time Series Features)

如果你的数据集中包含时间序列信息,你可以创建一些基于时间的特征来捕捉时间的趋势和周期性。在鸢尾花数据集中没有时间序列信息,但假设你有一个带有时间戳的数据集,你可以使用datetime库中的函数来生成时间序列特征。

import datetime
​
# 假设你的数据集中有一个"timestamp"列,包含时间戳信息
​
df['timestamp'] = pd.to_datetime(df['timestamp'])
​
# 提取时间特征
​
df['year'] = df['timestamp'].dt.year
df['month'] = df['timestamp'].dt.month
df['day'] = df['timestamp'].dt.day
df['hour'] = df['timestamp'].dt.hour
​
# 查看新特征
​
print(df.head())

通过生成交互特征、多项式特征和时间序列特征等,你可以利用领域知识或数据理解来创建新的特征,从而提高模型的性能。这些示例仅为特征工程的一小部分,实际上还有许多其他技术和方法可供探索和尝试。根据具体的问题和数据集,你可以选择适合的特征工程方法来优化模型的表现。

2.8 数据集平衡(Data Balancing)

处理不均衡数据集的问题可以使用欠采样(Undersampling)和过采样(Oversampling)等方法来平衡各类别样本的比例。然后,根据具体情况选择以下的欠采样或过采样方法进行处理。

首先,安装imbalanced-learn库

pip install imbalanced-learn

假设正在处理一个二分类任务的不均衡数据集,其中正例的数量远远少于负例。希望通过欠采样和过采样等方法来平衡数据集,确保各类别样本的比例合理。

import numpy as np
from sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
​
# 生成不均衡数据集
​
#     其中X.shape=(1000,100)即1000个样本量,每个样本量有100个特征
​
X, y = make_classification(n_samples=1000, weights=[0.9, 0.1], random_state=3220822,n_features=100)
​
# 打印原始数据集中各类别样本数量
​
print("原始数据集中各类别样本数量:")
print("类别 0 的样本数量:", np.sum(y == 0))
print("类别 1 的样本数量:", np.sum(y == 1))
​
# 使用过采样方法平衡数据集
​
ros = RandomOverSampler(sampling_strategy=0.5)
X_resampled, y_resampled = ros.fit_resample(X, y)
​
# 打印过采样后数据集中各类别样本数量
​
print("\n过采样后数据集中各类别样本数量:")
print("类别 0 的样本数量:", np.sum(y_resampled == 0))
print("类别 1 的样本数量:", np.sum(y_resampled == 1))
​
# 使用欠采样方法平衡数据集
​
rus = RandomUnderSampler(sampling_strategy=0.5)
X_resampled, y_resampled = rus.fit_resample(X, y)
​
# 打印欠采样后数据集中各类别样本数量
​
print("\n欠采样后数据集中各类别样本数量:")
print("类别 0 的样本数量:", np.sum(y_resampled == 0))
print("类别 1 的样本数量:", np.sum(y_resampled == 1))

通过打印原始数据集和处理后数据集中各类别样本的数量,可以观察到数据集平衡后各类别样本数量的变化。你可以根据实际情况选择适合的采样方法对数据集进行处理,使各类别样本的比例合理。并根据数据集的特点和需求进行调整。其中我们获取的X_resampled, y_resampled便是我们的新的数据集,可以拿去进行建立模型。

2.9 数据集合并(Data Integration)

import pandas as pd
​
# 创建学生信息数据集
​
student_data = pd.DataFrame({
    '学号': ['001', '002', '003', '004'],
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [18, 19, 20, 18],
    '性别': ['男', '女', '男', '女']
})
​
# 创建学生成绩数据集
​
score_data = pd.DataFrame({
    '学号': ['001', '002', '004', '005'],
    '科目': ['数学', '英语', '数学', '英语'],
    '分数': [80, 85, 90, 95]
})
​
# 创建课程信息数据集
​
course_data = pd.DataFrame({
    '科目': ['数学', '英语', '物理', '化学'],
    '学分': [4, 3, 3, 2]
})
​
# 行合并数据集
​
merged_data_rows = pd.concat([student_data, score_data, course_data])
​
# 列合并数据集
​
merged_data_columns = pd.concat([student_data, score_data, course_data], axis=1)
​
# 表连接操作
​
merged_data_join = pd.merge(student_data, score_data, on='学号', how='left')
​
# 打印行合并后的数据集
​
print("行合并后的数据集:")
print(merged_data_rows)
​
# 打印列合并后的数据集
​
print("\n列合并后的数据集:")
print(merged_data_columns)
​
# 打印表连接后的数据集
​
print("\n表连接后的数据集:")
print(merged_data_join)

2.10 数据降维(Dimensionality Reduction)

数据降维是减少数据集维度的过程,旨在去除冗余特征、提高计算效率、减少存储空间、避免维度灾难以及改善模型表现。下面详细介绍几种常用的数据降维方法:

主成分分析(Principal Component Analysis, PCA):PCA是一种常用的无监督降维方法。它通过线性变换将原始特征投影到一个新的坐标系中,使得新坐标轴上的方差尽可能大,并且不同坐标轴之间尽可能不相关。通过保留主成分分析中的前k个主成分,可以实现数据降维。

t-SNE(t-Distributed Stochastic Neighbor Embedding):t-SNE是一种非线性降维方法,常用于可视化高维数据。它在保持样本点之间的局部相似性的同时,试图捕捉原始数据的全局结构。t-SNE通常用于探索数据集中的聚类和类别之间的关系。

线性判别分析(Linear Discriminant Analysis, LDA):LDA是一种有监督降维方法。它将样本投影到低维空间,使得同类样本尽可能靠近,不同类样本尽可能分开。LDA在分类任务中经常用于降低维度,并且具有一定的分类能力。

特征选择法:特征选择方法通过选择与目标变量相关性高的特征,剔除与目标变量关联性较低的特征,从而实现降维。常用的特征选择方法包括方差选择法、单变量特征选择、基于模型的特征选择等

奇异值分解(Singular Value Decomposition, SVD):SVD是一种常用的矩阵分解技术,可以用于降维。通过对数据矩阵进行奇异值分解,可以得到特征值、特征向量和奇异值矩阵,从而实现数据降维。

非负矩阵分解(Non-negative Matrix Factorization, NMF):NMF是一种非负矩阵分解技术,常用于非负数据的降维。它将原始数据矩阵分解为非负的两个低秩矩阵,从而实现数据降维。

这些方法各有特点,适用于不同的数据集和问题。在实际应用中,需要根据数据集特点和任务要求选择合适的降维方法,并评估降维后数据的信息保留程度。同时,也可以结合多种降维方法进行组合使用,以获得更好的降维效果。

2.10.1 PCA(主成分分析)

首先,我们需要导入所需的库和数据集。在这个示例中,我们将使用sklearn库来实现降维方法,同时使用make_classification生成想要的数据集形式作为案例。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
​
# 生成不数据集
​
#     其中X.shape=(1000,100)即1000个样本量,每个样本量有100个特征
​
X, y = make_classification(n_samples=1000, weights=[0.5, 0.5], random_state=3220822,n_features=100)
​
# 使用PCA进行降维
​
#     并且降维至n_components=2维度
​
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
​
# 绘制PCA降维后的散点图plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('PCA Dimensionality Reduction')
plt.show()

2.10.2 t-SNE(t-Distributed Stochastic Neighbor Embedding)

from sklearn.manifold import TSNE
​
# 使用t-SNE进行降维
​
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
​
# 绘制t-SNE降维后的散点图
​
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
plt.xlabel('t-SNE Dimension 1')
plt.ylabel('t-SNE Dimension 2')
plt.title('t-SNE Dimensionality Reduction')
plt.show()
​
使用t-SNE进行降维。同样地,我们将把数据降到2维,并绘制散点图进行可视化。
​
2.7.3 LDA(线性判别分析)
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
​
n = 5
​
# 其中X.shape=(1000,100)即1000个样本量,每个样本量有100个特征
​
# n_classes=n,表明该数据集共有n类
​
X, y = make_classification(n_samples=1000, random_state=3220822,n_features=100,n_classes=n,n_informative=n)
​
# 使用LDA进行降维
​
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X, y)
​
# 绘制LDA降维后的散点图
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y)
plt.xlabel('LDA Dimension 1')
plt.ylabel('LDA Dimension 2')
plt.title('LDA Dimensionality Reduction')
plt.show()

注意: LDA算法中,降维的维度数量 n_components 不能超过样本特征数目或者类别数目减去1。这是因为在LDA中,投影到低维空间的维度数量不能超过样本的维度数量或者类别的数量减去1。

因此,确保指定的 n_components 参数小于等于 min(n_features, n_classes - 1),其中 n_features 是样本的特征数目,n_classes 是类别的数目减去1。

2.11 数据集划分(Data splitting)

对数据进行了一系列的清洗、转换等操作后,为我们的模型建立提供有效的数据集。但仍需要切割数据集为3部分:训练集、验证集和测试集。

from sklearn.model_selection import train_test_split
​
# 假设你的特征数据保存在X中,标签保存在y中
​
# X和y是NumPy数组或Pandas DataFrame类型(在此代码块中,X,y是2.3.1出现的鸢尾花数据集)
​
# 首先将数据集划分为训练集和测试集
​
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3220822)
​
# 再将训练集进一步划分为训练集和验证集
​
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=3220822)
​
# 查看各个数据集的样本数量
print("训练集样本数量:", X_train.shape[0])
print("验证集样本数量:", X_val.shape[0])
print("测试集样本数量:", X_test.shape[0])
​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面向对象编程:深入PHP的封装、继承和多态性!

文章目录 面向对象OOP的核心概念定义类、创建对象构造函数和析构函数访问修饰符继承方法重写接口和抽象类静态方法和属性魔术方法 错误处理错误处理概述错误级别异常处理自定义异常设置错误处理忽略错误错误日志断言 总结 面向对象编程&#xff08;OOP&#xff09;是一种编程范…

设计资讯 | 这款受数学方程启发的平板桌:配集成黑胶唱片机和无线充电器

早在 1903 年&#xff0c;英国数学家亨利欧内斯特杜德尼就想出了将正方形变形为等边三角形的方法。这个技巧是将正方形分割成可重新排列的四个不同形状。这种方法经过一个多世纪的各种应用&#xff0c;仍然具有价值。 1986 年&#xff0c;建筑师 David Ben-Grunberg 和他的艺术…

加速打开gtihub的工具dev-sidecar

加速github&#xff0c;git clone&#xff0c; pip install 直接上工具链接 dev-sidecar code: https://github.com/docmirror/dev-sidecar dev-sidecar releases: https://github.com/docmirror/dev-sidecar/releases 不想看code的&#xff0c;直接点击 dev-sidecar releases…

Leetcode 1108. IP地址无效化

Leetcode 1108. IP 地址无效化 问题&#xff1a;给你一个有效的 IPv4 地址address&#xff0c;返回这个 IP 地址的无效化版本。 所谓无效化 IP 地址&#xff0c;其实就是用 "[.]" 代替了每个 "."。 方法1&#xff1a;对字符串挨个进行判断&#xff0c;如…

C语言 ——— 经典有关动态内存的笔试题

目录 笔试题1 笔试题2 笔试题3 笔试题1 代码演示&#xff1a; #include<stdio.h> #include<string.h> void GetMemory(char* p) {p (char*)malloc(100); } void Test() {char* str NULL;GetMemory(str);strcpy(str, "hello world");printf("…

计算机Java项目|基于SpringBoot的周边游平台设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

Gameplay Ability System(事件通知)

一、打开角色蓝图BP_BaseCharacter添加节点 1、添加Send Gameplay Event to Actor节点&#xff0c;当玩家的武器碰到敌人时发送GameplayEvent。 2、给该事件添加Event Tag标签&#xff1a;Ability.MeleeAttack.Damage.Event。 3、通过Make GameplayEventData给事件添加Payload…

图解计算机网络:一条 HTTP 请求的网络拓扑之旅

引言 常见的网络拓扑结构如下图所示&#xff1a; 在此拓扑中&#xff0c;终端设备通过 WiFi 连接到路由器&#xff0c;路由器再连接到光猫&#xff08;或终端设备通过移动网络 4G/5G 连接到基站&#xff09;&#xff0c;之后 ISP 网络服务提供商接管网络通信&#xff0c;将请求…

电脑如何录屏?高清录制教程来袭,快收藏!

在数字化时代&#xff0c;电脑录屏已经成为了我们学习和工作中的一项重要技能。如果你想知道电脑如何录屏&#xff0c;这里有几个简单的方法可以帮助你开始。 一、福昕网课录制大师 虫洞 https://www.foxitsoftware.cn/REC/ 这个软件因为又专业又好上手&#xff0c;挺受大家…

LaTex插入图片

LaTeX 提供了许多定制化图片的功能。这篇文章将会介绍如何用最常见的格式插入图片、缩放图片以及如何在文档中引用这些图片。 1.基本使用 效果图如图所示。 \documentclass{article} \usepackage{graphicx} \graphicspath{ {./figure/} }\begin{document}\begin{figure}[!t]…

排序(归并排序,非比较排序)

归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法&#xff08;Divide and Conquer&#xff09;的⼀个⾮常典型的应⽤。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&…

《深入浅出WPF》读书笔记.6binding系统(中)

《深入浅出WPF》读书笔记.6binding系统(中) 背景 这章主要讲各种模式的数据源和目标的绑定。 代码 把控件作为Binding源与Binding标记扩展 方便UI元素之间进行关联互动 <Window x:Class"BindingSysDemo.BindingEle"xmlns"http://schemas.microsoft.com…

IP打开“向下”空间,爱奇艺“摊牌了”

长视频领域上半年竞争激烈、好剧频出&#xff0c;让行业焕发了新的吸引力&#xff0c;优质内容对行业的正向引导作用持续凸显。正如爱奇艺创始人、CEO龚宇最新的发言&#xff1a;“长视频行业实现长期发展的关键在于优质内容供给的持续性&#xff0c;以及内容质量和商业收益的双…

页面设计任务 商品详情页

目录 成品: 任务描述 源码&#xff1a; 详细讲解&#xff1a; 1.导航栏讲解 2.主体部分 3.图像部分 4.评分部分 5.按钮部分 6.配置信息部分 7.响应式设计 成品: 任务描述 创建一个产品展示页面&#xff0c;包括以下内容&#xff1a; 网页结构&#xff1a;使用 HTM…

选择适合的电脑监控软件,可以提升员工效率

在信息化时代&#xff0c;企业对员工的管理不再仅限于传统的考勤制度和绩效评估。随着工作方式的多样化&#xff0c;特别是远程办公的普及&#xff0c;电脑监控软件成为企业管理的重要工具。这些软件不仅能帮助管理者了解员工的工作状态&#xff0c;还能有效提升工作效率&#…

唯有自救,才能得救

回顾这一周的五天&#xff0c;也做成了一些事&#xff0c;想做的事&#xff0c;立即行动&#xff0c;几乎是心到手到&#xff0c;最后也出了一些成绩。 全红婵跳完水&#xff0c;得了个满分&#xff0c;一边走路&#xff0c;一边擦头发&#xff0c;旁边的记者问&#xff1a;你…

数字孪生网络 (DTN)关键技术分析

数字孪生网络 (DTN): 概念、架构及关键技术 摘要 随着5G商用规模部署和下一代互联网IPv6的深化应用&#xff0c;新一代网络技术的发展引发了产业界的广泛关注。智能化被认为是新一代网络发展的趋势&#xff0c;为数字化社会的信息传输提供了基础。面向数字化、智能化的新一代网…

Leetcode面试经典150题-42.接雨水

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/**本题的解题思路是双指针&#xff1a;一个从头开始一个从尾巴开始&#xff0c;两头的肯定是没有办法接住雨水的,你可以认为0位置左边是0的柱子所以理论上我们是从1遍历到n-2&#xff0c;但是你也可以遍历0到N…

SpringData基础学习

一、SpringData 概述 二、SpringData JPA HelloWorld 三、Repository 接口

快速入门:使用Python构建学生成绩管理应用

前言 诸位观众&#xff0c;本学期我有幸学习了Python编程课程。随着课程的结束&#xff0c;授课教师布置了一项任务&#xff0c;要求我们开发一个学生信息管理系统。基于老师的要求&#xff0c;我个人独立完成了这项任务。今天&#xff0c;我希望将这个简易的程序分享给大家&a…