机器学习和深度学习的_滑坡自动识别和滑坡易发性制图 基于滑坡自动识别和滑坡易发性制图的完整实现
滑坡自动识别和滑坡易发性制图
机器学习和深度学习实现
语言:Python
软件:Arcgis,Jupyter notebook或Pycharm
模型:随机森林,支持向量机,神经网络
过程:1. 数据集制作(自己准备影像和滑坡标注,本人提供影像是有偿的)2. 代码(数据读取、数据划分、模型训练、应用模型、绘制ROC曲线、精度评价、预测结果输出)3. 结果制图。
基于滑坡自动识别和滑坡易发性制图的完整实现流程,使用 Python 和 ArcGIS、Jupyter Notebook 或 PyCharm 环境。我数据集制作、代码实现(包括随机森林、支持向量机和神经网络模型)、结果制图等步骤。
.tif
)。import numpy as np
import rasterio
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import roc_curve, auc, accuracy_score
import matplotlib.pyplot as plt
# 读取影像数据
def read_raster(file_path):
with rasterio.open(file_path) as src:
data = src.read()
profile = src.profile
return data, profile
# 加载数据
image, profile = read_raster('path/to/image.tif')
labels, _ = read_raster('path/to/labels.tif')
# 展平数据
image = image.reshape(image.shape[0], -1).T
labels = labels.flatten()
# 去除无效值(如 NaN)
valid_mask = ~np.isnan(labels)
X = image[valid_mask]
y = labels[valid_mask]
# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 预测
y_pred_rf = rf_model.predict(X_test)
y_prob_rf = rf_model.predict_proba(X_test)[:, 1]
# 训练支持向量机模型
svm_model = SVC(probability=True, random_state=42)
svm_model.fit(X_train, y_train)
# 预测
y_pred_svm = svm_model.predict(X_test)
y_prob_svm = svm_model.predict_proba(X_test)[:, 1]
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
# 构建神经网络模型
nn_model = Sequential([
Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
Dropout(0.5),
Dense(32, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid')
])
nn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
nn_model.fit(X_train, y_train, epochs=20, batch_size=32, validation_split=0.2, verbose=1)
# 预测
y_prob_nn = nn_model.predict(X_test).flatten()
y_pred_nn = (y_prob_nn > 0.5).astype(int)
# 计算 ROC 曲线和 AUC
fpr_rf, tpr_rf, _ = roc_curve(y_test, y_prob_rf)
auc_rf = auc(fpr_rf, tpr_rf)
fpr_svm, tpr_svm, _ = roc_curve(y_test, y_prob_svm)
auc_svm = auc(fpr_svm, tpr_svm)
fpr_nn, tpr_nn, _ = roc_curve(y_test, y_prob_nn)
auc_nn = auc(fpr_nn, tpr_nn)
# 绘制 ROC 曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr_rf, tpr_rf, label=f'Random Forest (AUC = {auc_rf:.2f})')
plt.plot(fpr_svm, tpr_svm, label=f'SVM (AUC = {auc_svm:.2f})')
plt.plot(fpr_nn, tpr_nn, label=f'Neural Network (AUC = {auc_nn:.2f})')
plt.plot([0, 1], [0, 1], 'k--', label='Random Guess')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.show()
# 计算精度
accuracy_rf = accuracy_score(y_test, y_pred_rf)
accuracy_svm = accuracy_score(y_test, y_pred_svm)
accuracy_nn = accuracy_score(y_test, y_pred_nn)
print(f'Random Forest Accuracy: {accuracy_rf:.2f}')
print(f'SVM Accuracy: {accuracy_svm:.2f}')
print(f'Neural Network Accuracy: {accuracy_nn:.2f}')
# 使用随机森林模型进行预测
predicted_labels = rf_model.predict(image)
# 将预测结果保存为栅格文件
output_profile = profile.copy()
output_profile.update(dtype=rasterio.float32, count=1)
with rasterio.open('path/to/predicted_labels.tif', 'w', **output_profile) as dst:
dst.write(predicted_labels.reshape(profile['height'], profile['width']).astype(np.float32), 1)
predicted_labels.tif
)。从数据准备到模型训练、推理和结果制图的完整流程。同学你可以根据需求选择合适的模型(随机森林、SVM 或神经网络),并调整超参数以优化性能。
仅供参考,我的同学们