Используйте KFold для разделения фрейма данных: я хочу, чтобы строки были разделены, но вместо этого столбцы разделяются - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть 466 x 1025 данных. 1024 переменных и цель составляют столбцы. Я использую случайную лесную регрессию для набора данных и пытаюсь использовать сгибы для получения более последовательных прогнозов. Моя цель разделяется правильно, но при применении к данным столбцы разделяются вместо строк. Я получаю данные тренировки 466 x 372 и данные теста 466 x 94. Мне нужны данные тренировки 372 x 1024 и данные теста 94 x 1024. Как это исправить? Примечание: он работает правильно, когда я использую train_test_split ()

Код:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.ensemble import RandomForestRegressor

#read the data files, verify types
df = pd.read_csv('./allMolecules.csv')   

#the data frame is ready, now it's time for the random forest. 
#split data into train and test
xTrain, xTest, yTrain, yTest = train_test_split(finalDF.drop(['Target'], axis=1), finalDF['Target'],test_size=0.2)
model = RandomForestRegressor(n_estimators=1000)
output = model.fit(xTrain,yTrain)
score = model.score(xTest,yTest)
print('Model Settings:\n{0}\n'.format(output))
print('R2: {0}'.format(score))

folds = KFold(n_splits=5)
scores = []
data = finalDF.drop(['Target'], axis=1)
for trainIndex, testIndex in folds.split(finalDF.drop(['Target'], axis=1)):
    print(trainIndex, testIndex)
    xTrain = data[trainIndex]
    xTest = (finalDF.drop(['Target'], axis=1))[testIndex]
    yTrain = finalDF['Target'][trainIndex]
    yTest = finalDF['Target'][testIndex]
    print('\n\n{0}\n\n{1}\n\n{2}\n\n{3}'.format(xTrain,xTest,yTrain,yTest))
    output = model.fit(xTrain, yTrain)
    scores.append(model.score(xTest, yTest))

print(scores)

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Если вы заинтересованы в использовании pandas dataframe, то решение ваших проблем выглядит следующим образом:

import pandas as pd
from sklearn.model_selection import KFold

X = [[ 0.87, -1.34,  0.31, 0],
     [-2.79, -0.02, -0.85, 1],
     [-1.34, -0.48, -2.55, 0],
     [ 1.92,  1.48,  0.65, 1]]

finalDF = pd.DataFrame(X * 20, columns=['col1', 'col2', 'col3', 'Target'])


folds = KFold(n_splits=5)
scores = []
for trainIndex, testIndex in folds.split(finalDF.drop(['Target'], axis=1)):
    # print(trainIndex, testIndex)
    xTrain = finalDF.loc[trainIndex, :]
    xTest = finalDF.loc[testIndex, :]
    print(xTrain.shape, xTest.shape)

Для этого примера вы получите в качестве вывода (в распечатке)

(64, 4) (16, 4)
(64, 4) (16, 4)
(64, 4) (16, 4)
(64, 4) (16, 4)
(64, 4) (16, 4)

Ваша проблема заключалась в том, что при попытке доступа к Dataframe лучше указать индекс или доступ к столбцам, и метод lo c является хорошим вариантом для этого. В случае y вы получите хороший результат, потому что вы преобразуетесь в pd.Series перед индексацией.

Надеюсь, это поможет!

1 голос
/ 30 апреля 2020

Я думаю, что в какой-то момент индексация может быть неправильной. KFold разбивается только по первой оси. Попробуйте упростить его, разделите на X и y перед индексированием по результатам folds.split и вместо этого работайте с массивами:

X = finalDF.drop(['Target'], axis=1).values
y = finalDF.target.values
for trainIndex, testIndex in folds.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
...