机器学习预处理

一、数据读取

数据的读取方式有多种,最终我们可以转化为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.rhkb.cn/news/404792.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【故障处理】- ping不通的原因

PING不通是一个非常常见的网络问题&#xff0c;它可能由多种原因引起。如链路故障、ARP学习失败等 以一个Ping不通的尝试示例&#xff0c;介绍Ping不通故障的定位思路。如下图&#xff1a; PC3 Ping不通PC4 PC>ping 20.1.1.20Ping 20.1.1.20: 32 data bytes, Press Ctrl_C…

亚马逊铺货ERP国内采集,图片编辑文本翻译一键拉伸,自...

亚马逊全功能 ERP 铺货采集&#xff0c;自动生成 SKU。 说说国内平台采集的商品如何通过 ERP 自己做链接上传发布到亚马逊平台&#xff01; 1. 首先进入 ERP 插件&#xff0c;直接点击 1688 平台采集自己想做的产品类型。各位按照自身的需求选择搜索的 JK&#xff0c;选择想采…

【GH】【EXCEL】P1: Write DATA SET from GH into EXCEL

文章目录 WriteFast WriteGH data material :GH process and components instructionFast Write DataFast Write Data & Clear DataFast Write to Cell EXCEL written results Write by ColumnGH data material :Compile ColumnGH process and components instructionWrite…

Redis RDB三两事

rdb&#xff1a;将数据库的快照以二进制格式保存在文件中&#xff0c;redis重启后直接加载数据。可以通过save和bgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则&#xff0c;例如 save 60 1000 如果60秒内不少于1000个key发生了改动&#xff0c;则生成一个新的rdb文件…

如何在C++ QT 程序中集成cef3开源浏览器组件去显示网页?

目录 1、问题描述 2、为什么选择cef3浏览器组件 3、cef3组件的介绍与下载 4、将cef3组件封装成sdk 5、如何使用cef3组件加载web页面 5.1、了解CefApp与CefClient 5.2、初始化与消息循环 5.3、如何创建浏览器 5.4、重载CefClient类 6、在qt客户端集成cef组件 7、最后…

什么是主机加固?主机加固的几种有效方法

在数字化时代&#xff0c;数据的价值不言而喻&#xff0c;但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露&#xff0c;企业的数据安全面临着前所未有的挑战。为了应对这些挑战&#xff0c;一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案&#xff0c;采用先…

Using Azure openAI key rotation automation

题意&#xff1a;使用 Azure OpenAI 密钥轮换自动化 问题背景&#xff1a; We are planning to do the Azure OpenAI key rotation automatically. How can we achieve this? Do we have terraform resource for this. 我们计划自动执行 Azure OpenAI 密钥轮换。我们如何实现…

运维小技能:通过调整JVM的默认内存配置来解决内存溢出(‌OutOfMemoryError)‌或栈溢出(‌StackOverflowError)‌等错误

文章目录 引言I 调整JVM的默认堆内存配置1.1 java命令启动jar包时配置JVM 的内存参数1.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数II 案例: Linux 操作系统设置tomcat的 JVM 的内存参数查找Tomcat位置: 快速定位服务状态和部署位置具体配置步骤扩展: 监测Nginx访…

Mysql查询日志

Mysql查询日志 Mysql查询日志默认是关闭状态的。 mysql> show variables like %general_log%; --------------------------------------- | Variable_name | Value | --------------------------------------- | general_log | OFF …

Python数分实战

学习视频&#xff1a;【课程3.0】Python基础与分析实战_哔哩哔哩_bilibili 由于学习过python进行数据分析&#xff0c;所以就简单记录一下&#xff0c;最主要学习的还是视频最后的两个项目&#xff0c;进行实战 之前想不明白明明有很智能的软件做数据分析&#xff0c;为什么还要…

C++票据查验、票据ocr、文字识别

现在&#xff0c;80、90后的人们逐渐过渡为职场上的主力人员&#xff0c;在工作中当然也会碰到各种各样的问题。比如&#xff0c;当你的老板给你一个艰难的任务时&#xff0c;肯定是不能直接拒绝的。那么我们该怎么做呢&#xff1f;翔云建议您先认真考虑老板说的任务的难度&…

倍福ADS通信教程

介绍 TwinCAT3 TwinCAT3是Beckhoff推出的一款基于PC的控制器软件&#xff0c;简单理解是一套集成开发环境&#xff0c;里边有各种分析工具以及通信中间件&#xff1b;开发者可以很方便的用它来进行IPC和PLC之间的通信连接 ADS 倍福ADS&#xff08;‌Automation Device Spec…

WebRTC音视频开发读书笔记(六)

数据通道不仅可以发送文本消息, 还可以发送图片、二进制文件,将其类型binaryType属性设置成arraybuffer类型即可. 九\、文件传输 1、文件传输流程 &#xff08;1&#xff09;使用表单file打开本地文件 &#xff08;2&#xff09;使用FileReader读取文件的二进制数据 &#…

零基础学习Redis(5) -- redis单线程模型介绍

前面我们提到过&#xff0c;redis是单线程的&#xff0c;这期我们详细介绍一下redis的单线程模型 1. redis单线程模型 redis只使用一个线程处理所有的请求&#xff0c;并不是redis服务器进程内部只有一个线程&#xff0c;其实也存在多个线程&#xff0c;只不过多个线程是在处…

SparkSQL遵循ANSI标准

ANSI简介 ANSI Compliance通常指的是遵循美国国家标准学会&#xff08;American National Standards Institute, ANSI&#xff09;制定的标准。在计算机科学和技术领域&#xff0c;这通常涉及到数据库管理系统&#xff08;DBMS&#xff09;对于SQL语言的支持程度。 ANSI为SQL…

基于vue框架的爱学习分享平台ud317(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,学科分类,交流答疑,论坛交流,学习资料 开题报告内容 基于Vue框架的爱学习分享平台 开题报告 一、项目背景与意义 随着互联网技术的飞速发展&#xff0c;知识的获取与传播方式正经历着前所未有的变革。在线教育平台逐渐成为满足…

如何理解:进程控制

文章目录 前言&#xff1a;进程创建&#xff1a;进程终止&#xff1a;如何终止进程&#xff1f;进程等待非阻塞等待&#xff1a; 总结&#xff1a; 前言&#xff1a; ​ 对于前面的地址空间的学习&#xff0c;我们现在了解到原来所谓变量的地址其实是虚拟地址&#xff0c;该虚…

【数学建模备赛】Ep05:斯皮尔曼spearman相关系数

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、斯皮尔曼spearman相关系数&#xff1a;☀️☀️☀️1. 回顾皮尔逊相关系数2. 斯皮尔曼spearman相关系数3. 斯皮尔曼相关系数公式4. 另外一种斯皮尔曼相关系数定义5. matlab的用法5. matlab的用法 三、对斯皮尔曼相…

MySQL(二)——CRUD

文章目录 CRUD新增全列插入指定列插入插入查询结果 查询全列查询指定列查询查询字段为表达式表达式不包含字段表达式包含一个字段表达式包含多个字段 补充&#xff1a;别名去重查询排序条件查询 补充&#xff1a;运算符区间查询模糊查询NULL的查询 分页查询聚合查询聚合函数 分…

C++实现——红黑树

目录 1.红黑树 1.1红黑树的概念 1.2红黑树的性质 1.3红黑树节点的定义 1.4红黑树的插入操作 1.5红黑树的验证 1.6红黑树的删除 1.7红黑树与AVL树的比较 1.8红黑树的应用 1.红黑树 1.1红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位…