이 글은 Python에서 머신러닝 기능을 구현하는 네 가지 방법을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
이 기사에서는 데이터 세트에서 기능을 선택하는 다양한 방법을 소개하고 Scikit-learn(sklearn) 라이브러리를 사용하여 기능 선택 알고리즘의 유형과 Python에서의 구현에 대해 논의합니다.
통계 테스트를 사용하여 출력 변수와 가장 강한 관계가 있는 특징을 선택할 수 있습니다.
scikit-learn 라이브러리는 특정 수의 기능을 선택하기 위해 다양한 통계 테스트 세트와 함께 사용할 수 있는 SelectKBest 클래스를 제공합니다.
다음 예에서는 카이 제곱(chi^2) 통계를 사용하여 음이 아닌 특성을 테스트하여 Pima Indians 당뇨병 데이터세트에서 가장 좋은 네 가지 특성을 선택합니다.
#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,:])
각 특성과 선택한 네 가지 특성에 대한 점수( 최고 점수): 플라스마, 테스트, 질량 및 연령.
기능당 점수:
[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가 preg, Mass 및 pedi와 같은 처음 세 가지 기능을 선택하는 것을 볼 수 있습니다. 이는 support_array에서 True로 표시되고 순위 배열에서는 옵션 1로 표시됩니다.
PCA는 선형 대수학을 사용하여 데이터 세트를 압축된 형식으로 변환합니다. 일반적으로 이는 데이터 축소 기술로 간주됩니다. PCA의 한 가지 속성은 결과의 차원 또는 주성분 수를 변환하도록 선택할 수 있다는 것입니다.
다음 예에서는 PCA를 사용하고 세 가지 주 구성 요소를 선택합니다.
#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_)
변환된 데이터 세트(세 가지 주 구성 요소)가 원본 데이터와 거의 유사하지 않음을 확인할 수 있습니다.
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]]
특성 중요도는 훈련된 감독 분류자를 사용하여 특성을 선택하는 데 사용되는 기술입니다. 분류기(예: 의사결정 트리)를 훈련할 때 각 속성을 평가하여 분할을 생성하며 이 측정값을 기능 선택기로 사용할 수 있습니다. 자세히 알려주세요.
랜덤 포레스트는 상대적으로 우수한 정확도, 견고성 및 사용 용이성으로 인해 가장 널리 사용되는 기계 학습 방법 중 하나입니다. 또한 Average Impurity Reduction 및 Average Reduction Precision이라는 두 가지 간단한 특징 선택 방법도 제공합니다.
랜덤 포레스트는 많은 결정 트리로 구성됩니다. 의사결정 트리의 각 노드는 유사한 응답 값이 동일한 세트에 있도록 데이터 세트를 두 개로 분할하도록 설계된 단일 기능에 대한 조건입니다. (로컬적으로) 최적의 조건을 선택하는 측정항목을 불순도라고 합니다. 분류의 경우 일반적으로 지니 계수
불순물 또는 정보 이득/엔트로피이고 회귀 트리의 경우 분산입니다. 따라서 트리를 훈련할 때 각 특성이 트리의 가중치 불순물을 얼마나 줄이는지 계산할 수 있습니다. 산림의 경우 각 특성에 대한 불순물 감소를 평균화할 수 있으며 이 측정값에 따라 특성의 순위를 매길 수 있습니다.
특징 선택을 위해 Random Forest 분류기를 사용하는 방법을 살펴보고, 특징 선택 전후 분류기의 정확도를 평가해 보겠습니다. 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 개 이상의 교육 인스턴스가 포함되어 있습니다. 이 예에서는 50000개의 인스턴스를 사용하며 그 중 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개의 속성을 가진 약 35000개의 훈련 인스턴스가 포함되어 있습니다. 데이터세트의 크기는 매우 큽니다. 살펴보겠습니다:
Shape of the dataset (35000, 94) Size of Data set before feature selection: 26.32 MB
보시다시피 데이터 세트에는 35000개의 행과 94개의 열이 있으며 이는 26MB가 넘는 데이터입니다.
다음 코드 블록에서는 250개의 트리를 사용하여 랜덤 포레스트 분류기를 구성하고 최대 깊이는 30이며 랜덤 기능 수는 7이 됩니다. 다른 하이퍼파라미터는 sklearn 기본값이 됩니다.
#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에서 기계 학습 기능을 구현하는 네 가지 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!