この記事では、Python で機械学習関数を実装する 4 つの方法を紹介します。一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。
この記事では、データセットから特徴を選択するさまざまな方法を紹介し、特徴選択アルゴリズムの種類と、Scikit-learn (sklearn) ライブラリを使用した Python での実装について説明します。
統計テストを使用して、出力変数と最も強い関係を持つ特徴を選択できます。
scikit-learn ライブラリは、特定の数の特徴を選択するために別の統計テストのセットで使用できる SelectKBest クラスを提供します。
次の例では、カイ 2 乗 (chi ^ 2) 統計を使用して非負の特徴をテストし、Pima Indians Diabetes データセット内の 4 つの最良の特徴を選択します:
#Feature Extraction with Univariate Statistical Tests (Chi-squared for classification) #Import the required packages #Import pandas to read csv import pandas #Import numpy for array related operations import numpy #Import sklearn's feature selection algorithm from sklearn.feature_selection import SelectKBest #Import chi2 for performing chi square test from sklearn.feature_selection import chi2 #URL for loading the dataset url ="https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians diabetes/pima-indians-diabetes.data" #Define the attribute names names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] #Create pandas data frame by loading the data from URL dataframe = pandas.read_csv(url, names=names) #Create array from data values array = dataframe.values #Split the data into input and target X = array[:,0:8] Y = array[:,8] #We will select the features using chi square test = SelectKBest(score_func=chi2, k=4) #Fit the function for ranking the features by score fit = test.fit(X, Y) #Summarize scores numpy.set_printoptions(precision=3) print(fit.scores_) #Apply the transformation on to dataset features = fit.transform(X) #Summarize selected features print(features[0:5,:])
Each 属性のスコアと、選択した 4 つの属性 (最も高いスコアを持つ属性): plas、test、mass、age。
機能ごとのスコア:
[111.52 1411.887 17.605 53.108 2175.565 127.669 5.393 181.304]
機能:
[[148. 0. 33.6 50. ] [85. 0. 26.6 31. ] [183. 0. 23.3 32. ] [89. 94. 28.1 21. ] [137. 168. 43.1 33. ]]
再帰的削除プロパティによる RFE残りのプロパティに基づいてモデルを構築して作業します。モデルの精度を使用して、ターゲット属性の予測に最も寄与する属性 (および属性の組み合わせ) を特定します。次の例では、RFE およびロジスティック回帰アルゴリズムを使用して、上位 3 つの特徴を選択します。アルゴリズムの選択は、それが巧みで一貫性がある限り重要ではありません:
#Import the required packages #Import pandas to read csv import pandas #Import numpy for array related operations import numpy #Import sklearn's feature selection algorithm from sklearn.feature_selection import RFE #Import LogisticRegression for performing chi square test from sklearn.linear_model import LogisticRegression #URL for loading the dataset url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-dia betes/pima-indians-diabetes.data" #Define the attribute names names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] #Create pandas data frame by loading the data from URL dataframe = pandas.read_csv(url, names=names) #Create array from data values array = dataframe.values #Split the data into input and target X = array[:,0:8] Y = array[:,8] #Feature extraction model = LogisticRegression() rfe = RFE(model, 3) fit = rfe.fit(X, Y) print("Num Features: %d"% fit.n_features_) print("Selected Features: %s"% fit.support_) print("Feature Ranking: %s"% fit.ranking_)
実行後、次の結果が得られます:
Num Features: 3 Selected Features: [ True False False False False True True False] Feature Ranking: [1 2 3 5 6 1 1 4]
RFE が最初の 3 つの特徴を preg として選択していることがわかります。マスとペディ。これらは、support_array では True とマークされ、ranking_array では Option 1 とマークされます。
PCA は、線形代数を使用してデータ セットを圧縮形式に変換します。通常、これはデータ削減技術とみなされます。 PCA の特性の 1 つは、結果内の次元または主成分の数を変換することを選択できることです。
次の例では、PCA を使用して 3 つの主成分を選択します。
#Import the required packages #Import pandas to read csv import pandas #Import numpy for array related operations import numpy #Import sklearn's PCA algorithm from sklearn.decomposition import PCA #URL for loading the dataset url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians diabetes/pima-indians-diabetes.data" #Define the attribute names names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) #Create array from data values array = dataframe.values #Split the data into input and target X = array[:,0:8] Y = array[:,8] #Feature extraction pca = PCA(n_components=3) fit = pca.fit(X) #Summarize components print("Explained Variance: %s") % fit.explained_variance_ratio_ print(fit.components_)
変換されたデータ セット (3 つの主成分) はソース データとほとんど類似していないことがわかります。
Explained Variance: [ 0.88854663 0.06159078 0.02579012] [[ -2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-02 9.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03] [ -2.26488861e-02 -9.72210040e-01 -1.41909330e-01 5.78614699e-02 9.46266913e-02 -4.69729766e-02 -8.16804621e-04 -1.40168181e-01 [ -2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-01 2.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01]]
特徴重要度は、トレーニングされた教師あり分類器を使用して特徴を選択するために使用される手法です。分類器 (デシジョン ツリーなど) をトレーニングするとき、各属性を評価して分割を作成し、このメジャーを特徴セレクターとして使用できます。詳しくお知らせください。
ランダム フォレストは、精度、堅牢性、使いやすさが比較的優れているため、最も人気のある機械学習手法の 1 つです。また、Average Reduction in Impurity と Average Reduction in Precision という 2 つの簡単な特徴選択方法も提供します。
ランダム フォレストは多くのデシジョン ツリーで構成されます。デシジョン ツリーの各ノードは、同様の応答値が同じセットに収まるようにデータ セットを 2 つに分割するように設計された単一の特徴に対する条件です。 (局所的に) 最適な条件を選択するメトリックは、Impurity と呼ばれます。分類の場合は通常、ジニ係数
不純物または情報ゲイン/エントロピーであり、回帰木の場合は分散です。したがって、ツリーをトレーニングする場合、各特徴がツリー内の重み付けされた不純物をどの程度削減するかによって計算できます。森林の場合、各フィーチャの不純物の削減を平均し、この尺度に従ってフィーチャをランク付けできます。
特徴選択にランダム フォレスト分類器を使用する方法と、特徴選択の前後で分類器の精度を評価する方法を見てみましょう。 Otto データセットを使用します。
このデータセットは、10 の製品カテゴリ (ファッション、エレクトロニクスなど) にグループ化された 61,000 を超える 製品の 93 の曖昧な詳細を記述しています。入力属性は、ある種の個別のイベントの数です。
目標は、新製品の予測を 10 クラスごとの確率の配列として取得し、マルチクラス対数損失 (クロスエントロピーとも呼ばれます) を使用してモデルを評価することです。 )。
すべてのライブラリをインポートすることから始めます:
#Import the supporting libraries #Import pandas to load the dataset from csv file from pandas import read_csv #Import numpy for array based operations and calculations import numpy as np #Import Random Forest classifier class from sklearn from sklearn.ensemble import RandomForestClassifier #Import feature selector class select model of sklearn from sklearn.feature_selection import SelectFromModel np.random.seed(1)
データセットをトレーニング データとテスト データに分割する方法を定義しましょう。トレーニング パートでデータセットをトレーニングし、テスト パートでデータセットをトレーニングします。トレーニングされたモデルの評価に使用されます:
#Function to create Train and Test set from the original dataset def getTrainTestData(dataset,split): np.random.seed(0) training = [] testing = [] np.random.shuffle(dataset) shape = np.shape(dataset) trainlength = np.uint16(np.floor(split*shape[0])) for i in range(trainlength): training.append(dataset[i]) for i in range(trainlength,shape[0]): testing.append(dataset[i]) training = np.array(training) testing = np.array(testing) return training,testing
モデルの精度を評価する関数を追加する必要もあります。この関数は、予測出力と実際の出力を入力として受け取り、精度パーセントを計算します:
#Function to evaluate model performance def getAccuracy(pre,ytest): count = 0 for i in range(len(ytest)): if ytest[i]==pre[i]: count+=1 acc = float(count)/len(ytest) return acc
ここでデータセットをロードします。 train.csv ファイルをロードします。このファイルには 61,000 を超える トレーニング インスタンスが含まれています。この例では 50,000 個のインスタンスを使用します。そのうち 35,000 インスタンスを分類子のトレーニングに使用し、15,000 インスタンスを分類子のパフォーマンスのテストに使用します。
#Load dataset as pandas data frame data = read_csv('train.csv') #Extract attribute names from the data frame feat = data.keys() feat_labels = feat.get_values() #Extract data values from the data frame dataset = data.values #Shuffle the dataset np.random.shuffle(dataset) #We will select 50000 instances to train the classifier inst = 50000 #Extract 50000 instances from the dataset dataset = dataset[0:inst,:] #Create Training and Testing data for performance evaluation train,test = getTrainTestData(dataset, 0.7) #Split data into input and output variable with selected features Xtrain = train[:,0:94] ytrain = train[:,94] shape = np.shape(Xtrain) print("Shape of the dataset ",shape) #Print the size of Data in MBs print("Size of Data set before feature selection: %.2f MB"%(Xtrain.nbytes/1e6))
ここではデータ サイズに注目します。データセットには 94 の属性を持つ約 35,000 のトレーニング インスタンスが含まれており、データセットのサイズは非常に大きいです。見てみましょう:
Shape of the dataset (35000, 94) Size of Data set before feature selection: 26.32 MB
ご覧のとおり、データセットには 35,000 行と 94 列があり、26 MB を超えるデータになります。
次のコード ブロックでは、ランダム フォレスト分類子を構成します。250 個のツリーを使用し、最大深度は 30、ランダム特徴の数は 7 です。他のハイパーパラメータはデフォルト値になります。スクラーンの:
#Lets select the test data for model evaluation purpose Xtest = test[:,0:94] ytest = test[:,94] #Create a random forest classifier with the following Parameters trees = 250 max_feat = 7 max_depth = 30 min_sample = 2 clf = RandomForestClassifier(n_estimators=trees, max_features=max_feat, max_depth=max_depth, min_samples_split= min_sample, random_state=0, n_jobs=-1) #Train the classifier and calculate the training time import time start = time.time() clf.fit(Xtrain, ytrain) end = time.time() #Lets Note down the model training time print("Execution time for building the Tree is: %f"%(float(end)- float(start))) pre = clf.predict(Xtest) Let's see how much time is required to train the model on the training dataset: Execution time for building the Tree is: 2.913641 #Evaluate the model performance for the test data acc = getAccuracy(pre, ytest) print("Accuracy of model before feature selection is %.2f"%(100*acc))
我们模型的准确性是:
特征选择前的模型精度为98.82
正如您所看到的,我们正在获得非常好的准确性,因为我们将近99%的测试数据分类到正确的类别中。这意味着我们正在对15,000个正确类中的14,823个实例进行分类。
那么,现在我的问题是:我们是否应该进一步改进?好吧,为什么不呢?如果可以的话,我们肯定会寻求更多的改进; 在这里,我们将使用功能重要性来选择功能。如您所知,在树木构建过程中,我们使用杂质测量来选择节点。选择具有最低杂质的属性值作为树中的节点。我们可以使用类似的标准进行特征选择。我们可以更加重视杂质较少的功能,这可以使用sklearn库的feature_importances_函数来完成。让我们找出每个功能的重要性:
#Once我们培养的模型中,我们的排名将所有功能的功能在拉链(feat_labels,clf.feature_importances_):
print(feature) ('id', 0.33346650420175183) ('feat_1', 0.0036186958628801214) ('feat_2', 0.0037243050888530957) ('feat_3', 0.011579217472062748) ('feat_4', 0.010297382675187445) ('feat_5', 0.0010359139416194116) ('feat_6', 0.00038171336038056165) ('feat_7', 0.0024867672489765021) ('feat_8', 0.0096689721610546085) ('feat_9', 0.007906150362995093) ('feat_10', 0.0022342480802130366)
正如您在此处所看到的,每个要素都基于其对最终预测的贡献而具有不同的重要性。
我们将使用这些重要性分数来排列我们的功能; 在下面的部分中,我们将选择功能重要性大于0.01的模型训练功能:
#Select features which have higher contribution in the final prediction sfm = SelectFromModel(clf, threshold=0.01) sfm.fit(Xtrain,ytrain)
在这里,我们将根据所选的特征属性转换输入数据集。在下一个代码块中,我们将转换数据集。然后,我们将检查新数据集的大小和形状:
#Transform input dataset Xtrain_1 = sfm.transform(Xtrain) Xtest_1 = sfm.transform(Xtest) #Let's see the size and shape of new dataset print("Size of Data set before feature selection: %.2f MB"%(Xtrain_1.nbytes/1e6)) shape = np.shape(Xtrain_1) print("Shape of the dataset ",shape) Size of Data set before feature selection: 5.60 MB Shape of the dataset (35000, 20)
你看到数据集的形状了吗?在功能选择过程之后,我们只剩下20个功能,这将数据库的大小从26 MB减少到5.60 MB。这比原始数据集减少了约80%。
在下一个代码块中,我们将训练一个新的随机森林分类器,它具有与之前相同的超参数,并在测试数据集上进行测试。让我们看看修改训练集后得到的准确度:
#Model training time start = time.time() clf.fit(Xtrain_1, ytrain) end = time.time() print("Execution time for building the Tree is: %f"%(float(end)- float(start))) #Let's evaluate the model on test data pre = clf.predict(Xtest_1) count = 0 acc2 = getAccuracy(pre, ytest) print("Accuracy after feature selection %.2f"%(100*acc2)) Execution time for building the Tree is: 1.711518 Accuracy after feature selection 99.97
你能看到!! 我们使用修改后的数据集获得了99.97%的准确率,这意味着我们在正确的类中对14,996个实例进行了分类,而之前我们只正确地对14,823个实例进行了分类。
这是我们在功能选择过程中取得的巨大进步; 我们可以总结下表中的所有结果:
评估标准 | 在选择特征之前 | 选择功能后 |
---|---|---|
功能数量 | 94 | 20 |
数据集的大小 | 26.32 MB | 5.60 MB |
训练时间 | 2.91秒 | 1.71秒 |
准确性 | 98.82% | 99.97% |
上表显示了特征选择的实际优点。您可以看到我们显着减少了要素数量,从而降低了数据集的模型复杂性和维度。尺寸减小后我们的训练时间缩短,最后,我们克服了过度拟合问题,获得了比以前更高的精度。
以上がPython で機械学習関数を実装する 4 つの方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。