Код для запуска многократного извлечения рекурсивного объекта каждый раз, удаляя объект с самым низким рейтингом - PullRequest
0 голосов
/ 09 февраля 2019

Хорошо, поэтому я хочу запустить рекурсивное извлечение объектов в моем наборе данных с количеством объектов X и на каждой итерации удалять объект с самым низким рейтингом, чем повторно запускать RFE, пока у меня не останется только 5 объектов.Тем не менее, я понятия не имею, как это кодировать.

Первая часть запуска RFE - это хорошо, но я не хочу сидеть и вручную перезапускать RFE и удалять одну функцию за раз, для этого потребуется вечность.Может ли кто-нибудь помочь мне кодировать это?

import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFE
from sklearn.datasets import make_friedman1

X, y = make_friedman1(n_samples=2000, n_features=85, random_state=42)


# split data into train and test split
from sklearn.model_selection import train_test_split
# if we need train test split
X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3,random_state=42)

estimator = RandomForestClassifier(n_estimators=500, min_samples_leaf=5,
                             min_samples_split=8, max_features='auto',
                             max_depth=90, bootstrap=True)
selector = RFE(estimator, 83, step=1)
selector = selector.fit(X_train, y_train)


# predict and get rankings and optimal number of features
selector.fit(X_test, y_test)
selector.predict(X_test)
ranking = selector.ranking_
y_hats = selector.predict(X_test)
predictions = [round(value) for value in y_hats]
accuracy = accuracy_score(y_test, predictions)
print("Test Accuracy: %.2f%%" % (accuracy*100.0))


# index rankings
header = X_test.columns
frame = pd.DataFrame(ranking, index=header)
frame = frame.rename(columns = {frame.columns[0]: 'rankings'}, inplace = False)
frame = frame.sort_values(by = 'rankings', ascending=True)

# save table
from pandas.tools.plotting import table
ax = plt.subplot(111, frame_on=True) # no visible frame
ax.xaxis.set_visible(False)  # hide the x axis
ax.yaxis.set_visible(False)  # hide the y axis

table(ax, frame)  # where df is your data frame

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Решил сам, просто выполнив это:

iters = list(range(1, 235))
iters = iters[::-1]

for i in iters:


    estimator = RandomForestClassifier(n_estimators=500, min_samples_leaf=5,
                             min_samples_split=8, max_features='auto',
                             max_depth=90, bootstrap=True)
    selector = RFE(estimator, i, step=1)
    selector = selector.fit(X_train, y_train)
0 голосов
/ 10 февраля 2019
features = [1, 28, 9, 17, 0, 16, 9]

def recursive(features, max_features=5, max_iterations=100):
    feature_length = len(features)
    long_enough = (feature_length <= max_features)
    tried_too_many_times = (max_iterations < 1)
    if long_enough or tried_too_many_times:
        raise GeneratorExit(
            {
                'features': features,
                'iterations': max_iterations,
            }
        )
    _features = sorted(features, reverse=True)
    lowest = _features.pop()
    print('Removing', lowest)
    max_iterations -= 1
    yield from recursive(_features, max_features=max_features, max_iterations=max_iterations)


s = recursive(features)

try:
    list(s)
except GeneratorExit as e:
    context = e.args[0]

# Removing 0
# Removing 1

context
# {'features': [28, 17, 16, 9, 9], 'iterations': 98}
...