def Land_cover_pred_plot(array_folder,raster_file, reference_file,ML_algo, plot = False): df_train , train_array = get_data_eval(array_folder,raster_file, reference_file) df_train = df_train.dropna() print(df_train) train_array = np.array(train_array, dtype=object) tile_df = pd.DataFrame() for i, array in enumerate(train_array[0]): # print(train_array[i], train_array_name[i]) tile_df[train_array[1][i]] = np.nan_to_num(array.ravel(), copy=False) # print(train_array[0][i], train_array[1][i]) X_train, X_test, y_train, y_test = train_test_split(df_train.drop('type' , axis = 1),df_train['type'],test_size = 0.1) print(X_train) ML_algo.fit(X_train,y_train) test_pred = ML_algo.predict(X_test) confusion_mat = confusion_matrix(y_test,test_pred) classification_repo = classification_report(y_test, test_pred) test_acc = accuracy_score(y_test, test_pred) print("Confusion Matri : \n", confusion_mat) print("Classification Report : \n", classification_repo) print("Accuracy on Test : ", test_acc) pred_array = ML_algo.predict(tile_df) mask_array = np.reshape(pred_array, train_array[0][0].shape) class_sum = [] for i,j in enumerate(df_train['type'].unique()): sum = (mask_array == j).sum() class_sum.append([j,sum]) print(class_sum) print(mask_array) if plot == True: arr_f = np.array(mask_array, dtype = float) arr_f = np.rot90(arr_f, axes=(-2,-1)) arr_f = np.flip(arr_f,0) plt.imshow(arr_f) plt.colorbar() return mask_array
时间: 2023-06-18 10:02:09 浏览: 131
该函数是一个用于地表覆盖预测和绘图的函数。它需要一个包含训练数据的文件夹路径,一个栅格文件和一个参考文件作为输入。它还需要一个机器学习算法和一个布尔值作为是否要绘制图表的标志。函数调用 get_data_eval 函数来获取训练数据,并使用 train_test_split 函数将其分成训练集和测试集。然后,使用机器学习算法来拟合训练数据,预测测试数据,并计算准确度、混淆矩阵和分类报告。最后,使用训练后的模型来预测栅格文件中的地表覆盖,并将结果绘制成图表(如果 plot 参数为 True)。函数返回预测结果的数组。
相关问题
def __call__(self, pred, label): B = len(label) pred_shape = pred.shape repeat = pred.shape[1]//3200 pred = pred.view(pred_shape[0]*repeat, pred_shape[1]//repeat) label = torch.stack([label]*repeat, dim=1).view(B*repeat) B = len(label) pred = self.model(pred) max_data, max_idx = torch.topk(pred, k=2, dim=1) pred_true = max_idx[:,0]==label pred_false = max_idx[:, 0] != label loss_true = pred[torch.arange(B), label][pred_true]-pred[torch.arange(B), max_idx[:, 1]][pred_true]+self.margin loss_true = torch.sum(loss_true.mul(self.mul))/(len(loss_true)+1e-5) loss_false = (pred[torch.arange(B), label][pred_false]-pred[torch.arange(B), max_idx[:,0]][pred_false]+self.margin) loss_false = loss_false[loss_false>0] loss_false = torch.sum(loss_false.mul(self.mul))/(len(loss_false)+1e-5) loss = loss_true + loss_false return loss
这段代码定义了一个类的 __call__ 方法,用于计算模型的损失函数。其中传入的参数 pred 是模型的预测结果,label 是真实标签。首先计算 Batch size B 和预测结果的形状 pred_shape,然后根据 repeat 变量将预测结果 pred 和标签 label 进行重复,以便与原始的输入数据形状匹配。然后将预测结果 pred 输入到模型 self.model 中进行计算,得到模型输出 pred。接着使用 torch.topk() 函数找到每个样本中预测概率最大的两个类别的索引 max_idx,以及对应的预测概率 max_data。然后分别计算预测正确的样本的损失和预测错误的样本的损失。对于预测正确的样本,损失等于模型输出中对应类别的预测概率减去次大的预测概率加上 margin,并且将所有样本的损失相加并除以样本数得到平均损失 loss_true。对于预测错误的样本,只有当模型对正确类别的预测概率小于次大的预测概率加上 margin 时才计算损失,并将所有样本的损失相加并除以样本数得到平均损失 loss_false。最后将 loss_true 和 loss_false 相加得到总的损失 loss,并返回该值作为模型的训练目标。
fuzzy_pred = [] for i in range(len(y_pred)): fuzzy_class = np.zeros((3,)) fuzzy_class[y_pred[i]] = 1.0 fuzzy_pred.append(fuzzy_class) fuzzy_pred = np.array(fuzzy_pred) fuzzy_pred = np.argmax(fuzzy_pred, axis=1) report = classification_report(y_test, fuzzy_pred) print(report)该成四分类
如果你要将该代码从三分类改为四分类,你需要相应地修改以下几个部分:
1. 首先,你需要将`fuzzy_class`的长度从3改为4,因为你要处理4个类别。
```
fuzzy_class = np.zeros((4,))
```
2. 接着,你需要修改`fuzzy_class`的赋值方式,使其能够处理4个类别。假设你的标签是从0到3,你可以使用以下方式:
```
fuzzy_class[y_pred[i]] = 0.7
fuzzy_class[(y_pred[i]+1)%4] = 0.2
fuzzy_class[(y_pred[i]+2)%4] = 0.1
fuzzy_class[(y_pred[i]+3)%4] = 0.0
```
这里使用了一种简单的模糊逻辑,将最可能的类别赋值为0.7,其次可能的类别赋值为0.2和0.1,最不可能的类别赋值为0。你可以根据实际情况进行调整。
3. 最后,你需要修改`classification_report`函数的参数,将`labels`参数设置为`[0, 1, 2, 3]`,表示你要报告所有4个类别的指标。修改后的代码如下所示:
```
fuzzy_pred = []
for i in range(len(y_pred)):
fuzzy_class = np.zeros((4,))
fuzzy_class[y_pred[i]] = 0.7
fuzzy_class[(y_pred[i]+1)%4] = 0.2
fuzzy_class[(y_pred[i]+2)%4] = 0.1
fuzzy_class[(y_pred[i]+3)%4] = 0.0
fuzzy_pred.append(fuzzy_class)
fuzzy_pred = np.array(fuzzy_pred)
fuzzy_pred = np.argmax(fuzzy_pred, axis=1)
report = classification_report(y_test, fuzzy_pred, labels=[0, 1, 2, 3])
print(report)
```
阅读全文