一、数据读取
数据的读取方式有多种,最终我们可以转化为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])