Python、sklearn、svm、リモートセンシングデータ分類、コード例

@ python、sklearn、svm、リモートセンシングデータ分類、コード例

Python_sklearn_svmリモートセンシングデータ分類コードの例

(1)SVM原理の簡単な紹介

サポートベクターマシン(SVM)は、分類、回帰、外れ値検出など、一連の教師あり学習アルゴリズムの総称です。分類については、SVMは元々バイナリ分類問題を解決するために使用されていましたが、マルチ分類問題は複数のSVM分類器を構築することで解決できます。SVMには2つの主要な特性があります。1。最適な分類境界を求める、つまりトレーニングデータセットを正しく分割でき、SVMの基本的な考え方である最大の幾何学的間隔を持つ分離超平面を解く; 2.カーネルベースの拡張次元変換、カーネル関数の特徴変換を介して、線形の分離不可能な元のデータセットは、線形分離可能にするために次元増加変換によって変換されます。したがって、SVMのコアプロセスはカーネル関数とパラメーターの選択です。

(2)SVM実装環境分析

中国語出力コード互換フォーマットと参照ライブラリ関数、精度評価に使用されるライブラリ関数、およびsvmパラメータの最適化を設定します。
以下にいくつか示します内联代码片

 -*- coding: utf-8 -*-
#用于精度评价
from sklearn.metrics import cohen_kappa_score
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
#numpy引用
import numpy as np
#记录运行时间
import datetime
#文件路径操作
import os
#svm and best parameter select using grid search method
from sklearn import svm
from sklearn.model_selection import GridSearchCV
#scale the data to 0-1  用于数据归一化
from sklearn import preprocessing

(3)SVM関数パラメーターの最適化

SVMパラメータの最適化を実現するには、2つの一般的な方法があります。1つはグリッド検索方法(この記事)であり、もう1つはlibsvmツールを使用して交差検証を実行する方法です(後で記述し、関心がある場合はメッセージを残すことができます)。

def grid_find(train_data_x,train_data_y):
     # 10 is often helpful. Using a basis of 2, a finer.tuning can be achieved but at a much higher cost.
     # logspace(a,b,N),base默认=10,把10的a次方到10的b次方区间分成N份。
	C_range = np.logspace(-5, 9, 8, base=2) 
    # 如:C_range = 1/64,1/8,1/2,2,8,32,128,512
    gamma_range = np.logspace(-15, 3, 10, base=2)
    # 选择linear线性核函数和rbf核函数
    parameters = {'kernel': ('linear', 'rbf'), 'C': C_range, 'gamma': gamma_range}
    svr = svm.SVC()
     # n_jobs表示并行运算量,可加快程序运行结果。
     # 此处选择5折交叉验证,10折交叉验证也是常用的。
    clf = GridSearchCV(svr, parameters, cv=5, n_jobs=4)  
    # 进行模型训练
    clf.fit(train_data_x, train_data_y)
    print('最优c,g参数为:{0}'.format(clf.best_params_))
    # 返回最优模型结果
    svm_model = clf.best_estimator_
    return svm_model

グリッド検索方法の詳細:

(4)データ読み取り機能を書き込む(txt形式のトレーニングファイルとテストファイルを読み取る)

1つ目は、トレーニングデータとテストデータをtxt形式で読み取る機能です。
データのスクリーンショットは次のとおりです。このうち、データの最初の6列は、対象のリモートセンシング画像領域(roi)から抽出された6つのバンドのグレー値を表し、最後の列はデータカテゴリのラベルを表します。
このうち、データの最初の6列は、対象のリモートセンシング画像領域(roi)から抽出された6つのバンドのグレー値を表し、最後の列はデータカテゴリのラベルを表します。
コードは次のとおりです。ファイルパスを入力するだけです。

def open_txt_film(filepath):
    # open the film
    if os.path.exists(filepath):
        with open(filepath, mode='r') as f:
            train_data_str = np.loadtxt(f, delimiter=' ')
            print('训练(以及测试)数据的行列数为{}'.format(train_data_str.shape))
            return train_data_str
    else:
        print('输入txt文件路径错误,请重新输入文件路径')

(5)SVMモデル予測関数の準備

入力モデルとテストデータ、出力精度評価(混同行列、描画精度などを含む)。

def model_process(svm_model, test_data_x, test_data_y):
    p_lable = svm_model.predict(test_data_x)
    # 精确度为 生产者精度  召回率为 用户精度
    print('总体精度为 : {}'.format(accuracy_score(test_data_y, p_lable)))
    print('混淆矩阵为 :\n {}'.format(confusion_matrix(test_data_y, p_lable)))
    print('kappa系数为 :\n {}'.format(cohen_kappa_score(test_data_y, p_lable)))
    matric = confusion_matrix(test_data_y, p_lable)
    # output the accuracy of each category。由于类别标签是从1开始的,因此明确数据中最大值,即可知道有多少类
    for category in range(np.max(test_data_y)):
        # add 0.0 to keep the float type of output
        precise = (matric[category, category] + 0.0) / np.sum(matric[category, :])
        recall = (matric[category, category] + 0.0) / np.sum(matric[:, category])
        f1_score = 2 * (precise * recall) / (recall + precise)
        print(
            '类别{}的生产者、制图(recall)精度为{:.4}  用户(precision)精度为{:.4}  F1 score 为{:.4} '.format(category + 1, precise, recall, f1_score))                                 

(6)主な機能の記述

主な機能は、主にデータの読み取り、データの前処理、およびパラメーターの最適化、モデルのトレーニングとモデルの予測です。
異なるデータセットの場合、使用するたびに、トレーニングデータとテストデータのパスを変更するだけで済みます。

def main():
    # read the train data from txt film
    train_file_path = r'E:\CSDN\data1\train.txt'
    train_data = open_txt_film(train_file_path)
    # read the predict data from txt film
    test_file_path = r'E:\CSDN\data1\test.txt'
    test_data = open_txt_film(test_file_path)
     # data normalization for svm training and testing dataset
    scaler = preprocessing.MinMaxScaler().fit(train_data[:, :-1])
    train_data[:, :-1] = scaler.transform(train_data[:, :-1])
    # keep the same scale of the train data
    test_data[:, :-1] = scaler.transform(test_data[:, :-1])

    # conversion the type of data,and the label's dimension to 1-d
    train_data_y = train_data[:, -1:].astype('int')
    train_data_y = train_data_y.reshape(len(train_data_y))
    train_data_x = train_data[:, :-1]
    # 取出测试数据灰度值和标签值,并将2维标签转为1维
    test_data_x = test_data[:, :-1]
    test_data_y = test_data[:, -1:].astype('int')
    test_data_y = test_data_y.reshape(len(test_data_y))
    model = grid_find(train_data_x,train_data_y)
    # 模型预测
    model_process(model, test_data_x, test_data_y)

(7)main関数を呼び出す

プログラムの実行時間を記録するために、ここに数行のコードが追加されています。

if __name__ == "__main__":
    # remember the beginning time of the program
    start_time = datetime.datetime.now()
    print("start...%s" % start_time)

    main()

    # record the running time of program with the unit of minutes
    end_time = datetime.datetime.now()
    last_time = (end_time - start_time).seconds / 60
    print("The program is last %s" % last_time + " minutes")
    # print("The program is last {} seconds".format(last_time))

(8)トレーニングデータとテストデータ例のダウンロードアドレス

データは作成者のgithubリポジトリにあり、合計2つのファイル(train.txtおよびtest.txt)にあります。
[ダウンロードリンク]:(https://github.com/sunzhihu123/sunzhihu123.github.io)
図に示すように、ウェアハウスの下の[ダウンロード]をクリックします。
githubダウンロード

==この記事の利点:入力は2つしかありません。1つはトレーニングデータのパスで、もう1つはテストデータのパスであり、簡単に開始できます。また、リモートセンシング画像データを例にとります。さらに、githubはソースコード全体をアップロードします〜



オリジナルの記事を公開 賞賛7 訪問357

おすすめ

転載: blog.csdn.net/qq_36803951/article/details/105590046