Как создать перекрестную проверку по различным фреймам данных для контролируемой классификации? - PullRequest
0 голосов
/ 19 февраля 2020

Представьте, что у меня есть 4 кадра данных с разной длиной строк, но с таким же количеством столбцов, как это: df1 (200 строк, 4 столбца), df2 (100, 4), df3 (300, 4) и df4 (250, 4) .

Я хотел бы провести контролируемую классификацию между этими кадрами данных (всегда используя 3 для обучения и 1 для тестирования / проверки) и выяснить, какая комбинация дает мне лучший показатель точности. Это пример большего объема данных, и я хотел бы автоматизировать его путем перекрестной проверки.

Я подумал, что могу попытаться создать новый столбец для каждого кадра данных с укажите их c имя и затем объедините их все. А затем, возможно, создайте маску, которая будет дифференцировать наборы тренировок и тестов по этим новым столбцам. Но я до сих пор не знаю, как сделать перекрестную проверку между ними.

Фреймы данных были бы такими:

concatenated_dfs:

     feat1    feat2    feat3    feat4    name
0      4        6        57       78      df1
1      1        2        50       78      df1
2      1        1        57       78      df1
.      .        .        .         .       .
.      .        .        .         .       .
.      .        .        .         .       .
849    3        10       50       80      df4

Кто-нибудь может показать мне, как это сделать с некоторым кодом? Вы можете использовать любой алгоритм классификации scikit-learn, если хотите. Спасибо!

1 Ответ

2 голосов
/ 19 февраля 2020

Вы можете использовать scikit learn's cross_val_score с настраиваемой итерацией, чтобы сгенерировать индексы для разделений тренировочного теста в ваших данных. Вот пример:

# Setup - creating fake data to match your description
df = pd.DataFrame(data={"name":[x for l in [[f"df{i}"]*c for i, c in enumerate(counts, 1)] for x in l]})
for i in range(1, 5):
    df[f"feat{i}"] = np.random.randn(len(df))
X = df[[c for c in df.columns if c != "name"]]
y = np.random.randint(0, 2, len(df))

# Iterable to generate the training-test splits:
indices = list()
for name in df["name"].unique():
    train = df.loc[df["name"] != name].index
    test = df.loc[df["name"] == name].index
    indices.append((train, test))

# Example model - logistic regression
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()

# Using cross-val score with the custom indices:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=indices)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...