机器学习(遥感)| 一.数据处理—特征工程

一.数据处理—特征工程:

遥感数据的获取按照平台分为三种:地面光谱仪采集的目标地物高光谱曲线、无人机搭载的传感器获取的数据,以及卫星遥感数据。这部分内容会在遥感数据处理专题介绍,包括各个不同平台的图像和点云数据。

针对遥感图像,假设我们已经下载和处理好了遥感数据,并进行了地面采样实验,即获取了y (如果是分类y就是标签,反演y就是目标值)。并将其整理成了表格,数据准备好接下来就要对数据进行预处理。

1 数据清洗

数据清洗的目标是使数据集准确可靠,从而提高数据的可信度和数据分析的有效性。遥感领域一般不会出现该现象。因为采样数据一般就是真实情况,感觉不对你也没办法修正。因此,常见的问题有:缺失值、异常值、去重、时间序列数据的处理等。

  • 缺失值处理: 一般为某个样本/某个特征(某一行/列)缺失。这种情况下,如果样本很多一般选择删除该行数据,特征不重要也可以删除特征。但是更多的情况下会采取对原始遥感数据进行时空插值的方法将该缺失值补充代替。时间分辨率如果非常高可以用相近时间代替,空间上就用克里金插值法等。
  • 异常值处理: 在进行小区域研究的时候,我们通常会对特征变量进行统计分析,比如找出均值±3中误差范围外的数据认为是异常值进行处理。
  • 去重: 一般会出现空间分辨率很差,而采样点比较密集的情况下,导致每个像素点提取出的数据均一致。这个情况就需要按照实际情况合并了。例如,我们使用的是1km*1km的MODIS数据,但是在该区域我们采集了10条数据,提取数据的时候导致10条数据对应的所有特征都是一模一样的,这个时候就需要对这些数据进行合并去重了。

2.特征工程:

特征工程是数据分析中最耗时间和精力的一部分工作。它非常依赖于我们个人经验和对任务的权衡。我所给出的只是常规流程和个人经验,具体任务需要具体分析。

2.1 特征归一化/标准化:

为了消除特征之间的量纲影响,通常要对特征进行归一化。数据差别大(离散程度大)的特征权重较大,影响结果的准确性,并且也会影响模型的迭代速度,增加模型的训练时长。
实际应用通常对两者的区分不明显,但是两者是有区别的。

  • 归一化 (MinMaxScaler):(0~1)保留了数据的分布形状,适用于非正态分布的数据。
    在这里插入图片描述
  • 标准化(StandardScaler):(均值为0,标准差为1)对离群值相对较稳健,因为标准化使用均值和标准差进行缩放,不受极端值的干扰。

在这里插入图片描述

那么什么情况下需要对数据进行归一化(标准化)呢?归一化/标准化适合哪种情况呢?

  • 查看你要使用的算法对数据尺度的敏感性。一些算法,如支持向量机、k近邻、神经网络等,对于尺度敏感,可能需要进行归一化。对于那些不涉及距离度量、基于规则或概率分布的算法,通常不需要进行特征归一化。但在实践应用中,即使对于这些算法,进行归一化处理也可能有助于提高模型的性能和收敛速度。总而言之,拿不准的情况下,最后都进行归一化/标准化。
  • 查看特征的分布情况,如果数据近似正态分布,可以考虑使用标准化;如果不符合正态分布,可以考虑使用归一化。
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import numpy as np

'''
 这部分代码主要有三个函数,分别是.fit  .transform   .fit_transform
 本例给出直接拟合转换的代码.fit_transform,其他的类似。
 min_max_scaler / standard_scaler 为拟合好的转换器
'''

# 创建示例数据
data = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])

# 归一化
min_max_scaler = MinMaxScaler()  # 创建MinMaxScaler对象
normalized_data = min_max_scaler.fit_transform(data)  # 归一化数据
print("Normalized Data:")
print(normalized_data)

# 标准化
standard_scaler = StandardScaler()  # 创建StandardScaler对象
standardized_data = standard_scaler.fit_transform(data)  # 标准化数据
print("\nStandardized Data:")
print(standardized_data)

输出的结果:

Normalized Data:
[[0.  0.  0. ]
 [0.5 0.5 0.5]
 [1.  1.  1. ]]
 
 Standardized Data:
[[-1.22474487 -1.22474487 -1.22474487]
 [ 0.          0.          0.        ]
 [ 1.22474487  1.22474487  1.22474487]]

注意:一般进行归一化的时候,我们都是在训练集上进行的;然后在测试集上使用这个转换器进行转换。然后再评估模型。或者另一种方式是直接把数据集归一化,然后再划分训练/测试集。最后,在进行预测的时候同样需要对数据集进行相同尺度的归一化。

2.2 特征选择

通常来说,对于研究地表状况来说,特征变量就是波段反射率和NDVI、LST等产品。对特征的处理一般有两种方式:一种是从给定的特征中选择适合我们研究的,另一种是基于原有的特征构建新的特征。在机器学习中,特征工程才是最重要的,它的重要性是优于模型,因为模型基本都是确定的步骤。
选择合适的特征
一般来说,我们要了解研究对象的基本特质,根据特定的研究对象选择适合的波段。比如根据特定地物的光谱曲线选择合适的波段,对植被来讲就是红/红边波段。但是在机器学习的遥感应用中,即使我们没有相关专业背景,也可以基于统计学进行特征筛选。我们给出3类筛选方法,并且基于sklearn也可以方便的完成。分别是:过滤式,包装式,嵌入式

1.过滤式

  • 方差这个概念在我们的研究中还是很重要的,之前可能很多人不在意。特征的方差越大,数据越离散化,包含的信息就越多,那么我们认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大;极端情况下,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,直接删。
    在实际应用中,我们会指定一个方差的阈值,当方差小于这个阈值的特征会被我们筛掉。sklearn中的VarianceThreshold类可以很方便的完成这个工作。

  • 相关系数和假设检验:
    主要用于回归任务 (y是连续值) 的监督学习算法中。我们分别计算各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。我们也对数据进行皮尔逊相关性检验,得到p-value,根据p-value进行筛选。还有其他很多检验方法可供选择,都是可以的。
    卡方检验:用于比较分类变量之间的关联性或独立性。常用于列联表分析等情况,例如判断两个分类变量之间是否存在相关性或者一个分类变量对另一个分类变量的影响是否显著。
    F 检验:用于比较两个或多个组之间的方差是否相等。常用于分析方差(ANOVA)等情况,例如比较不同治疗组之间的平均效果是否有显著差异。在sklearn中,有F检验的函数f_classiff_regression,分别在分类和回归特征选择时使用。
    t 检验:用于比较两个组的平均值是否有显著差异。t 检验有多种变体,例如独立样本 t 检验、配对样本 t 检验等,适用于不同的数据情形。
    下面给出Pearsn相关性检验的代码,适合特征和目标均为连续的情况

import numpy as np
from scipy.stats import pearsonr

# 生成特征矩阵 X 和目标变量 y
# 假设 X 是一个包含 100 个样本和 3 个特征的特征矩阵,y 是连续变量的目标变量向量
X = np.random.rand(100, 3)  # 100 个样本,3 个特征
y = 2 * X[:, 0] + 3 * X[:, 1] + 0.5 * X[:, 2] + np.random.normal(0, 0.1, 100)  # 根据线性关系生成目标变量 y

# 对每个特征与目标变量之间的关系进行皮尔逊相关性检验
for i in range(X.shape[1]):
    pearson_corr, p_value = pearsonr(X[:, i], y)
    print(f"Feature {i+1}: Pearson Correlation Coefficient = {pearson_corr}, p-value = {p_value}")

  • 互信息
    类似于信息增益,互信息可以衡量两个随机变量之间的所有关联性,而不受特征或目标变量类型的限制。有mutual_info_classif和mutual_info_regression。
    针对分类问题,可以使用信息增益或基尼指数等指标来评估特征与目标变量之间的关联程度,然后选择最具有信息量的特征,值同样是越大越好。这个也能应用于分类任务,同样是选择mutual_info_classif。
    下面给出信息增益的代码,适合特征连续/离散,目标离散的情况
import numpy as np
from sklearn.feature_selection import mutual_info_classif
# 生成特征矩阵 X,假设有 100 个样本,4 个特征
X = np.random.rand(100, 4)
# 生成目标变量 y,假设是二元分类,随机生成 0 和 1
y = np.random.randint(2, size=100)

# 使用 mutual_info_classif 函数计算每个特征与目标变量之间的互信息
information_gains = mutual_info_classif(X, y)
  1. 包装法
    包装法的解决思路是通过尝试不同的特征子集来进行特征选择,以找到最佳的特征子集。与过滤法不同,包装法通过在特征子集上训练模型,并根据模型性能来评估特征的好坏。主要是贪婪算法(例如递归特征消除)或启发式搜索(例如遗传算法)等。Sequential Feature Selection
    最常用的包装法是递归消除特征法(recursive feature elimination)。给定一个为特征分配权重的外部估计器(例如,线性模型的系数),递归特征消除(RFE)的目标是通过递归地考虑越来越小的特征集来选择特征。首先,估计器在初始特征集上进行训练,并且每个特征的重要性通过任何特定属性(例如coef_,feature_importances_)来获得。然后,从当前的特征集中删除最不重要的特征。在该集合上递归地重复此过程,直到最终达到要选择的所需特征数量。在sklearn中,可以使用RFE函数来选择特征。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

# 生成一个简单的二分类数据集
X, y = make_classification(n_samples=100, n_features=10, n_informative=5, random_state=42)

# 初始化逻辑回归模型作为评估器
estimator = LogisticRegression()

# 初始化递归特征消除(RFE)对象
rfe = RFE(estimator, n_features_to_select=5, step=1)

# 使用RFE进行特征选择
rfe.fit(X, y)

# 打印选择的特征
print("Selected Features:", rfe.support_)
print("Feature Ranking:", rfe.ranking_)
Selected Features: [False False  True False  True  True False  True False  True]
Feature Ranking: [6 5 1 2 1 1 3 1 4 1]

[False False True False True True False True False True]表示第3、5、6、8、10个特征被选中了,而其他特征没有被选中。
Feature Ranking为1被选中了,而其他的没有被选中。
3. 嵌入式
嵌入法也是用机器学习的方法来选择特征,它和包装发的共同之处在于都利用了机器学习模型来评估特征的重要性,并根据这些评估来选择最佳的特征子集。
不同的是,嵌入法的特征选择是作为模型训练的一部分,模型会自动选择最佳的特征或生成特征的重要性分数。在模型训练过程中,会考虑特征的重要性,并根据这些重要性进行特征选择。例如,决策树、支持向量机、神经网络等模型在训练过程中会自动选择重要的特征。而包装法的特征选择是通过尝试不同的特征子集来进行的,每次迭代都会重新训练模型,并根据模型的性能来评估特征的重要性。在特征选择过程中,会利用模型的性能来指导特征选择,以找到最佳的特征子集。

  • 新特征的构建
    在得到光谱反射率数据产品后,我们还可以根据需要寻找到更多新的特征。比如高光谱曲线的一阶导、二阶导等等,你可以一直导下去。建议在第一次建立模型的时候,我们可以先不构造新特征,得到以后基准模型后,再寻找新的特征进行优化。
    寻找新的特征最常用的方法,若干特征之和:例如,年积温;若干特征之差:生长速度;若干项特征乘除:SAVI、NDWI等各种植被指数。这部分需要有相关专业的背景了。当然特征也不是越多越好,为了避免维度灾难,最好保持特征:样本的比例在1:10以下。

Notes: 分类任务会出现:特征连续/离散,目标离散的情况,建议用ANOVA或者信息增益;回归任务:特征连续(特征离散就奇怪了吧),目标连续。建议pearson或者mutual_info_regression。

2.3 数据不平衡的处理方法

我们在做遥感分类的收,经常会碰到类别不均衡的情况,模型在学习的适合显然去偏向于类别多的那类数据。举个例子,我们是一个二分类问题,如果训练集里A类,B类别样本占比为10:1。 而测试集里A类, B类别样本5:5。 如果不考虑类别不平衡问题,训练出来的模型对于类别B的预测准确率会很低,甚至低于50%。解决方法一般是两种方法:权重法或者采样法。

  • 权重法
    在训练阶段,对训练集里的每个类别加一个权重class_weight。如果该类别的样本数多,那么它的权重就低,反之则权重就高以SVM为例,假设label分别是0和1,在构建模型的时候,在其参数内部进行权重方法的设置。
from sklearn.svm import SVC

# 使用balanced参数,自动计算类别权重
svm_model = SVC(class_weight='balanced')

# 手动设置类别权重
class_weights = {0: 1, 1: 2}
svm_model = SVC(class_weight=class_weights)

Scikit-learn还提供了可以对每个样本加权重的功能sample_weight,思路和类别权重也是一样,即样本数多的类别样本权重低,反之样本权重高,一般用不到。sklearn中,绝大多数分类算法都有class_weight和 sample_weight可以使用。

  • 采样法
    同样是上述情况,A/B样本数量为10:1,那么我们可以对A类的样本子采样,使得样本数量保持一致,只用子采样得到的A类样本数和B类现有样本一起做训练集拟合模型。另一种是对类别B样本做过采样, 直到过采样得到的B类别样本数加上B类别原来样本一起和A类样本数一致,最后再去拟合模型。过采样方法有重复才采样,也就是简单的复制粘贴;以及合成采样方法:通过生成合成样本来平衡不同类别的样本数量。其中最常见的方法是SMOTE(Synthetic Minority Over-sampling Technique),它通过对少数类样本之间的特征向量进行插值来生成新的合成样本。简单来说就是(x1,y)(x2,y),它可以给你生成((x1+x2)/2,y1)。

最后,以上均为个人理解和实际案例;具体如何执行还需要自己结合实际应用来进行实践,多多尝试。如有遗漏,欢迎大家交流,互相补充。

Reference:

https://scikit-learn.org/stable/modules/classes.html?highlight=feature_selection#module-sklearn.feature_selection

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 机器学习可以通过建立预测模型,使用历史数据和地理信息数据,来预测城市建成区栅格数据。通常采用监督学习的方法,首先需要准备一批已知标签的训练数据,包括城市建成区栅格数据和其它有关的地理信息数据(如地形、土地利用类型等),然后使用一些机器学习算法(如决策树、支持向量机、神经网络等)对这批数据进行训练,得到一个预测模型。之后,对于新的未知数据,可以使用这个模型来进行预测,从而得到城市建成区栅格数据。需要注意的是,由于城市建成区的变化较为复杂,所以预测模型的准确性需要不断地进行验证和优化。 ### 回答2: 机器学习可以用于预测城市建成区栅格数据,以下是一种基本的方法: 首先,需要准备数据集,包括城市建成区的栅格数据和相应的标签(已知的建成区和未建成区)。可以使用遥感数据、地理信息系统数据等获取栅格数据。然后,标记该栅格数据,将已建成区域设为“1”(正例)和未建成区域设为“0”(负例)。 其次,需要选择合适的机器学习算法,如支持向量机(SVM)、随机森林(Random Forest)或神经网络(Neural Network)。这些算法可以自动学习给定的特征,并根据已知的标签进行预测。 然后,应该将数据集拆分为训练集和测试集。训练集用于训练机器学习模型,而测试集用于评估模型的预测性能。拆分数据集的比例应根据实际情况进行调整,以确保训练集和测试集的大小合适。 接下来,使用训练集训练机器学习模型。训练过程中,模型会学习各种特征和标签之间的关系。训练完成后,可以使用测试集评估模型的准确性和性能。 最后,应用模型进行预测。将城市建成区的栅格数据输入到已经训练好的模型中,模型会根据先前学习到的关系进行预测,将未知区域标记为“1”(建成区)或“0”(未建成区)。 需要注意的是,城市建成区栅格数据的预测可能受到多种因素的影响,如数据质量、特征选择、模型选择等。因此,在实际应用中,需要根据具体情况进行参数调优、特征工程等操作,以提高预测结果的准确性和可靠性。 ### 回答3: 机器学习在预测城市建成区栅格数据方面可以采用以下步骤。 首先,需要准备训练数据。这些数据可以来自于城市建成区的历史记录、卫星图像或其他相关数据源。训练数据应包括输入特征和对应的标签。输入特征可以包括土地利用类型、地形高度、规划用途等信息,而标签则是栅格数据中已知的建成区和非建成区的分类。 接下来,选择合适的机器学习算法。常用的算法包括决策树、支持向量机、随机森林和深度学习等。选择算法需要综合考虑算法在处理空间数据上的性能和准确性。 然后,对训练数据进行特征工程。这一步骤包括数据清洗、特征选择和特征转换等。清洗数据可以排除无效或错误的数据,特征选择可以优化算法的性能,特征转换可以将原始数据转换为算法可处理的形式。 接着,使用训练数据对选定的机器学习算法进行训练。在训练过程中,算法将学习输入特征与标签之间的关系,并生成预测模型。训练的目标是使预测模型能够最准确地预测建成区和非建成区的分类。 最后,利用生成的预测模型对新的数据进行预测。新的数据可以是之前未见过的栅格数据,通过输入特征,预测模型将给出该栅格数据属于建成区还是非建成区的概率或分类结果。 总结来说,机器学习通过准备训练数据、选择算法、特征工程、训练模型和进行预测,能够预测城市建成区栅格数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值