10.3 Feature Selection
The oml.automl.FeatureSelection
class identifies the most relevant feature subsets for a training data set and an Oracle Machine Learning algorithm.
In a data analytics application, feature selection is a critical data preprocessing step that has a high impact on both runtime and model performance. The oml.automl.FeatureSelection
class automatically selects the most relevant features for a data set and model. It internally uses several feature-ranking algorithms to identify the best feature subset that reduces model training time without compromising model performance. Oracle advanced meta-learning techniques quickly prune the search space of this feature selection optimization.
The oml.automl.FeatureSelection
class supports classification and regression algorithms. To use the oml.automl.FeatureSelection
class, you specify a data set and the Oracle Machine Learning algorithm on which to perform the feature reduction.
For information on the parameters and methods of the class, invoke
help(oml.automl.FeatureSelection)
or see Oracle Machine Learning for
Python API Reference.
Example 10-2 Using the oml.automl.FeatureSelection
Class
This example uses the oml.automl.FeatureSelection
class. The example builds a model on the full data set and computes predictive accuracy. It performs automated feature selection, filters the columns according to the determined set, and rebuilds the model. It then recomputes predictive accuracy.
import oml
from oml import automl
import pandas as pd
import numpy as np
from sklearn import datasets
# Load the digits data set into the database.
digits = datasets.load_digits()
X = pd.DataFrame(digits.data,
columns = ['pixel{}'.format(i) for i
in range(digits.data.shape[1])])
y = pd.DataFrame(digits.target, columns = ['digit'])
oml_df = oml.create(pd.concat([X, y], axis=1), table = 'DIGITS')
# Split the data set into train and test.
train, test = oml_df.split(ratio=(0.8, 0.2),
seed = 1234, strata_cols='digit')
X_train, y_train = train.drop('digit'), train['digit']
X_test, y_test = test.drop('digit'), test['digit']
# Default model performance before feature selection.
mod = oml.svm(mining_function='classification').fit(X_train,
y_train)
"{:.2}".format(mod.score(X_test, y_test))
# Create an automated feature selection object with accuracy
# as the score_metric.
fs = automl.FeatureSelection(mining_function='classification',
score_metric='accuracy', parallel=4)
# Get the reduced feature subset on the train data set.
subset = fs.reduce('svm_linear', X_train, y_train)
"{} features reduced to {}".format(len(X_train.columns),
len(subset))
# Use the subset to select the features and create a model on the
# new reduced data set.
X_new = X_train[:,subset]
X_test_new = X_test[:,subset]
mod = oml.svm(mining_function='classification').fit(X_new, y_train)
"{:.2} with {:.1f}x feature reduction".format(
mod.score(X_test_new, y_test),
len(X_train.columns)/len(X_new.columns))
# Drop the DIGITS table.
oml.drop('DIGITS')
# For reproducible results, add a case_id column with unique row
# identifiers.
row_id = pd.DataFrame(np.arange(digits.data.shape[0]),
columns = ['CASE_ID'])
oml_df_cid = oml.create(pd.concat([row_id, X, y], axis=1),
table = 'DIGITS_CID')
train, test = oml_df_cid.split(ratio=(0.8, 0.2), seed = 1234,
hash_cols='CASE_ID',
strata_cols='digit')
X_train, y_train = train.drop('digit'), train['digit']
X_test, y_test = test.drop('digit'), test['digit']
# Provide the case_id column name to the feature selection
# reduce function.
subset = fs.reduce('svm_linear', X_train,
y_train, case_id='CASE_ID')
"{} features reduced to {} with case_id".format(
len(X_train.columns)-1,
len(subset))
# Drop the tables created in the example.
oml.drop('DIGITS')
oml.drop('DIGITS_CID')
Listing for This Example
>>> import oml
>>> from oml import automl
>>> import pandas as pd
>>> import numpy as np
>>> from sklearn import datasets
>>>
>>> # Load the digits data set into the database.
... digits = datasets.load_digits()
>>> X = pd.DataFrame(digits.data,
... columns = ['pixel{}'.format(i) for i
... in range(digits.data.shape[1])])
>>> y = pd.DataFrame(digits.target, columns = ['digit'])
>>> oml_df = oml.create(pd.concat([X, y], axis=1), table = 'DIGITS')
>>>
>>> # Split the data set into train and test.
... train, test = oml_df.split(ratio=(0.8, 0.2),
... seed = 1234, strata_cols='digit')
>>> X_train, y_train = train.drop('digit'), train['digit']
>>> X_test, y_test = test.drop('digit'), test['digit']
>>>
>>> # Default model performance before feature selection.
... mod = oml.svm(mining_function='classification').fit(X_train,
... y_train)
>>> "{:.2}".format(mod.score(X_test, y_test))
'0.92'
>>>
>>> # Create an automated feature selection object with accuracy
... # as the score_metric.
... fs = automl.FeatureSelection(mining_function='classification',
... score_metric='accuracy', parallel=4)
>>> # Get the reduced feature subset on the train data set.
... subset = fs.reduce('svm_linear', X_train, y_train)
>>> "{} features reduced to {}".format(len(X_train.columns),
... len(subset))
'64 features reduced to 41'
>>>
>>> # Use the subset to select the features and create a model on the
... # new reduced data set.
... X_new = X_train[:,subset]
>>> X_test_new = X_test[:,subset]
>>> mod = oml.svm(mining_function='classification').fit(X_new, y_train)
>>> "{:.2} with {:.1f}x feature reduction".format(
... mod.score(X_test_new, y_test),
... len(X_train.columns)/len(X_new.columns))
'0.92 with 1.6x feature reduction'
>>>
>>> # Drop the DIGITS table.
... oml.drop('DIGITS')
>>>
>>> # For reproducible results, add a case_id column with unique row
... # identifiers.
>>> row_id = pd.DataFrame(np.arange(digits.data.shape[0]),
... columns = ['CASE_ID'])
>>> oml_df_cid = oml.create(pd.concat([row_id, X, y], axis=1),
... table = 'DIGITS_CID')
>>> train, test = oml_df_cid.split(ratio=(0.8, 0.2), seed = 1234,
... hash_cols='CASE_ID',
... strata_cols='digit')
>>> X_train, y_train = train.drop('digit'), train['digit']
>>> X_test, y_test = test.drop('digit'), test['digit']
>>>
>>> # Provide the case_id column name to the feature selection
... # reduce function.
>>> subset = fs.reduce('svm_linear', X_train,
... y_train, case_id='CASE_ID')
... "{} features reduced to {} with case_id".format(
... len(X_train.columns)-1,
... len(subset))
'64 features reduced to 45 with case_id'
>>>
>>> # Drop the tables created in the example.
... oml.drop('DIGITS')
>>> oml.drop('DIGITS_CID')
Parent topic: Automated Machine Learning