[ラジオミクス] 分類器モデルの設計 - ランダム フォレスト + サポート ベクター マシン


1. ランダムフォレストの分類

  • 決定木( Decision Tree)
    • 正味現在価値の期待値が 0 以上になる確率を取得する決定木を構築することにより、さまざまな状況の発生確率を知ることに基づいています。
    • デシジョン ツリーは、各内部ノードが属性のテストを表し、各ブランチがテスト出力を表し、各リーフ ノードがカテゴリを表すツリー構造です。

  • Python でのデシジョン ツリーの実装
    • 関数: sklearn.tree.DecisionTreeClassifier ( from sklearn.tree import DecisionTreeClassifier)
    • モデルの初期化: dt_model = DecisionTreeClassifier()
    • トレーニング データ:dt_model.fit(X, y)

  • ランダム フォレスト• ランダム フォレストは、複数のツリーを使用してサンプルをトレーニングおよび予測する分類器
    を指します

  • ランダム フォレストの主な利点
    精度が優れている •大規模なデータセット
    で効率的に実行できる•高次元の特徴を持つ入力サンプルを処理できる•分類問題における各特徴の重要性(重み)を評価できる

  • Python でのランダム フォレスト分類の実装
    • 関数: from sklearn.ensemble import RandomForestClassifier
    • モデルの初期化: model_rf = RandomForestClassifier()
    • トレーニング データ:model_rf.fit(X, y)

  • ランダム フォレスト分類 Python コード:
    R コード リファレンス: R 言語 - ランダム フォレスト分類

    # 导入包
    import pandas as pd
    import numpy as np
    from sklearn.preprocessing import StandardScaler
    from scipy.stats import ttest_ind, levene
    from sklearn.linear_model import LassoCV
    from sklearn.utils import shuffle
    from sklearn.ensemble import RandomForestClassifier # 随机森林分类器
    from sklearn.model_selection import train_test_split # 训练集测试集分割
    
    # 导入数据
    xlsx_a = 'data/featureTable/aa.xlsx'
    xlsx_b = 'data/featureTable/bb.xlsx'
    data_a = pd.read_excel(xlsx_a)
    data_b = pd.read_excel(xlsx_b)
    print(data_a.shape,data_b.shape)
    # (212, 30) (357, 30)
    
    # t 检验特征筛选
    index = []
    for colName in data_a.columns[:]: 
        if levene(data_a[colName], data_b[colName])[1] > 0.05: 
            if ttest_ind(data_a[colName], data_b[colName])[1] < 0.05: 
                index.append(colName)
        else: 
            if ttest_ind(data_a[colName], data_b[colName],equal_var=False)[1] < 0.05: 
                index.append(colName)
    print(len(index))  # 25
    print(index)
    # ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'M', 'N', 'P', 'Q', 'R', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD']
    
    # t 检验后数据处理
    data_a = data_a[index]
    data_b = data_b[index]
    rows_a,cols_a = data_a.shape
    rows_b,cols_b = data_b.shape
    labels_a = np.zeros(rows_a)
    labels_b = np.ones(rows_b)
    data_a.insert(0, 'label', labels_a)
    data_b.insert(0, 'label', labels_b)
    data = pd.concat([data_a,data_b])
    data = shuffle(data)
    data.index = range(len(data))
    X = data[data.columns[1:]]
    y = data['label']
    X = X.apply(pd.to_numeric, errors='ignore')
    colNames = X.columns
    X = X.fillna(0)
    X = X.astype(np.float64)
    X = StandardScaler().fit_transform(X)
    X = pd.DataFrame(X)
    X.columns = colNames
    print(data.shape)  # (569, 26)
    
    # LASSO 特征筛选
    alphas = np.logspace(-4,1,50)
    model_lassoCV = LassoCV(alphas = alphas,max_iter = 100000).fit(X,y)
    coef = pd.Series(model_lassoCV.coef_, index = X.columns)
    print(model_lassoCV.alpha_)
    print('%s %d'%('Lasso picked',sum(coef != 0)))
    print(coef[coef != 0])
    index = coef[coef != 0].index  # 提取权重不为 0 的特征数据
    X = X[index]  
    
    np.set_printoptions(threshold=np.inf)  # 设置输出结果不带省略
    
    # 分割训练集、测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3,random_state = 15)
    # X 数据,y label 分组,test_size=0.3 训练集:测试集=7:3,random_state = 15(随机种子)
    
    # 随机森林分类
    model_rf = RandomForestClassifier(
      n_estimators = 200  # default 100 设置随机森林中有多少棵树
      , criterion = 'entropy' # 分类标准:'gini' and 'entropy'熵,default 'gini',gini 指数
      , random_state = 20  # default = None(随机种子)
      , class_weight = 'balanced' # default = None 分类出的数据组别之间平衡处理
      )
    
    model_rf.fit(X_train,y_train)  # 训练集训练
    # print(model_rf.score(X_test,y_test))  # 测试集准确率
    # print(model_rf.predict(X_test))  # 测试集各病例基于训练集模型的预测结果
    # print(model_rf.predict_proba(X_test)) # 测试集预测结果的预测概率
    # print(model_rf.n_features_)  # 拟合模型过程中用了多少特征
    # print(model_rf.feature_importances_)  # 各特征的权重,权重加和=1
    print(model_rf.get_params())  # 构建模型时的各项参数
    

2. サポートベクターマシンの分類

  • サポートベクターマシン:サポートベクターマシン、SVM
    二値分類モデル(実際には多分類が可能、SVM処理)
    基本モデル:特徴空間で定義された最大区間の線形分類器(実際には非線形)
    基本的な考え方: 解決トレーニング データ セットを正しく分割でき、最大の幾何学的間隔を持つ分離超平面(2 次元空間の直線と 3 次元空間の平面と同様に、2 つのケース クラスを分割できます。)
    カーネル トリックを備えており、実質的に非線形の分類器になります。
    ここに画像の説明を挿入

  • カーネル関数
    • 実際のアプリケーションでは、ほとんどのデータは線形分離可能ではありません。つまり、条件を満たす超平面は存在しません。
    • カーネル関数を通じてデータを高次元空間にマッピングすることで、線形分離不可能性の問題を解決できます。元の空間の
    • 一般的に使用されるカーネル関数:線形カーネル関数 (linear)、多項式カーネル関数 (poly)、動径基底カーネル関数 (rbf)、シグモイドカーネル関数 (S 字型)
    ここに画像の説明を挿入

  • rbf 動径基底カーネル関数の重要なパラメーター
    • パラメーターγ(ガンマ):単一サンプルの影響範囲を定義します。γ が大きいほどサポート ベクターが多くなります(図に示すように、より多くのサンプルが考慮され、すべてのサンプルが過学習しやすくなります)。下の図の黄色の線内)
    ペナルティ係数C: 「不正な」サンプルの許容範囲を定義します。
    ここに画像の説明を挿入

  • Python でサポート ベクター マシン分類を実装します。
    • 機能: from sklearn.svm import SVC
    • モデルの初期化:model_svc = svm.SVC(kernel = ‘rbf’, gamma = 0.05, C = 1)カーネル関数 kernel、パラメーター γ、およびペナルティ係数 C を設定します。
    • データトレーニング: model_svc.fit(X_train, y_train)
    • 精度: model_svc.score(X, y)
    • パラメータの取得:model_svc.get_params()

  • 参考文献:
    分類アルゴリズムのサポート ベクター マシン: SVM (理論)
    分類アルゴリズムのサポート ベクター マシン: SVM (アプリケーション)

  • ベクター マシン分類の Python コードをサポート:
    モジュールのインポートを除き、SVM 分類の前の手順はランダム フォレスト分類と同じです。

    # 导入包
    import pandas as pd
    import numpy as np
    from sklearn.preprocessing import StandardScaler
    from scipy.stats import ttest_ind, levene
    from sklearn.utils import shuffle
    from sklearn.linear_model import LassoCV
    from sklearn.model_selection import train_test_split
    from sklearn.svm import SVC  # 支持向量分类器
    
    # 导入数据
    xlsx_a = 'data/featureTable/aa.xlsx'
    xlsx_b = 'data/featureTable/bb.xlsx'
    data_a = pd.read_excel(xlsx_a)
    data_b = pd.read_excel(xlsx_b)
    print(data_a.shape,data_b.shape)
    # (212, 30) (357, 30)
    
    # t 检验特征筛选
    index = []
    for colName in data_a.columns[:]: 
        if levene(data_a[colName], data_b[colName])[1] > 0.05: 
            if ttest_ind(data_a[colName], data_b[colName])[1] < 0.05: 
                index.append(colName)
        else: 
            if ttest_ind(data_a[colName], data_b[colName],equal_var=False)[1] < 0.05: 
                index.append(colName)
    print(len(index))  # 25
    print(index)
    # ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'M', 'N', 'P', 'Q', 'R', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD']
    
    # t 检验后数据处理
    data_a = data_a[index]
    data_b = data_b[index]
    rows_a,cols_a = data_a.shape
    rows_b,cols_b = data_b.shape
    labels_a = np.zeros(rows_a)
    labels_b = np.ones(rows_b)
    data_a.insert(0, 'label', labels_a)
    data_b.insert(0, 'label', labels_b)
    data = pd.concat([data_a,data_b])
    data = shuffle(data)
    data.index = range(len(data))
    X = data[data.columns[1:]]
    y = data['label']
    X = X.apply(pd.to_numeric, errors='ignore')
    colNames = X.columns
    X = X.fillna(0)
    X = X.astype(np.float64)
    X = StandardScaler().fit_transform(X)
    X = pd.DataFrame(X)
    X.columns = colNames
    print(data.shape)  # (569, 26)
    
    # LASSO 特征筛选
    alphas = np.logspace(-4,1,50)
    model_lassoCV = LassoCV(alphas = alphas,max_iter = 100000).fit(X,y)
    coef = pd.Series(model_lassoCV.coef_, index = X.columns)
    print(model_lassoCV.alpha_)
    print('%s %d'%('Lasso picked',sum(coef != 0)))
    print(coef[coef != 0])
    index = coef[coef != 0].index  # 提取权重不为 0 的特征数据
    X = X[index]  
    
    np.set_printoptions(threshold=np.inf)  # 设置输出结果不带省略
    
    # 分割训练集、测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3,random_state = 15)
    # X 数据,y label 分组,test_size=0.3 训练集:测试集=7:3,random_state = 15(随机种子)
    
    # SVM 分类
    model_svm = SVC(kernel='rbf', gamma = 'scale', probability=True)
    # 设置核函数为 rbf
    # gamma = 'scale' =1/(特征数×方差);'auto' = 1/特征数;还可以写浮点数,具体需要做参数优化
    # probability=True 设置为 True,后面才能查看概率
    
    # 训练集拟合模型
    model_svm.fit(X_train,y_train)
    # print(model_svm.score(X_test,y_test))  # 测试集准确率
    # print(model_svm.predict(X_test))   # 测试集各病例基于训练集模型的预测结果
    # print(model_svm.predict_proba(X_test))  # 测试集预测结果的预测概率
    print(model_svm.get_params())  # 构建模型时的各项参数
    

おすすめ

転載: blog.csdn.net/zea408497299/article/details/125308443