記事ディレクトリ
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()) # 构建模型时的各项参数