Как использовать pandas DataFrames со sklearn? - PullRequest
0 голосов
/ 14 апреля 2020

Цель моего проекта - предсказать уровень точности некоторых текстовых описаний.

Я сделал векторы с FASTTEXT.

Вывод TSV:

0  1:0.0033524514 2:-0.021896651 3:0.05087798 4:0.0072637126 ...
1  1:0.003118149 2:-0.015105667 3:0.040879637 4:0.000539902 ...

Ресурсы помечены как Хорошие (1) или Плохие (0).

Для проверки точности я использовал scikit-learn и SVM.

После этого учебника я сделал это script:


import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
import numpy as np
import matplotlib.pyplot as plt

r_filenameTSV = 'TSV/A19784.tsv'

tsv_read = pd.read_csv(r_filenameTSV, sep='\t',names=["vector"])

df = pd.DataFrame(tsv_read)

df = pd.DataFrame(df.vector.str.split(' ',1).tolist(),
                                   columns = ['label','vector'])


print ("Features:" , df.vector)

print ("Labels:" , df.label)

X_train, X_test, y_train, y_test = train_test_split(df.vector, df.label, test_size=0.2,random_state=0)

#Create a svm Classifier
clf = svm.SVC(kernel='linear') 

#Train the model using the training sets
clf.fit (str((X_train, y_train)))

#Predict the response for test dataset
y_pred = clf.predict(X_test)

print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

При первой попытке запустить скрипт я получил эту ошибку в строке 28:

ValueError: could not convert string to float:

Поэтому я изменился с

clf.fit (X_train, y_train)

на


clf.fit (str((X_train, y_train)))

Затем, в той же строке, я получил эту ошибку

TypeError: fit() missing 1 required positional argument: 'y'

Предложения, как решить эту проблему?

С уважением и спасибо за ваше время .

1 Ответ

0 голосов
/ 15 апреля 2020

Как упомянуто в комментариях под вашим вопросом, ваши функции и ваш ярлык - это, безусловно, строки Однако sklearn требует, чтобы они были нумерацией c (sklearn обычно используется с массивами numpy). В этом случае вам необходимо преобразовать элементы вашего информационного кадра из строк в числовые значения c.

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

import numpy as np
import pandas as pd

df = pd.DataFrame({'features': [['5', '4.2'], ['3', '7.9'], ['2', '9']],
                   'label': ['1', '0', '0']})
print(type(df.features[0][0]))
print(type(df.label[0]))


def convert_to_float(collection):
    floats = [float(el) for el in collection]
    return np.array(floats)


df_numeric = pd.concat([df["features"].apply(convert_to_float),
                pd.to_numeric(df["label"])],
               axis=1)
print(type(df_numeric.features[0][0]))
print(type(df_numeric.label[0]))

Однако , описанный формат кадра данных не соответствует формату, ожидаемому моделями sklearn pandas датафреймы иметь. Насколько я знаю, модели sklearn ожидают, что каждая функция будет храниться в отдельном столбце, как это имеет место здесь:

from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

feature_df = pd.DataFrame(np.arange(6).reshape(3, 2), columns=["feature_1", "feature_2"])
label_df = pd.DataFrame(np.array([[1], [0], [0]]), columns=["label"])
df = pd.concat([feature_df, label_df], axis=1)

X_train, X_test, y_train, y_test = train_test_split(df.drop(["label"], axis=1), df["label"], test_size=1 / 3)
clf = SVC(kernel='linear')
clf.fit(X_train, y_train)
clf.predict(X_test)

То есть после преобразования вашего фрейма данных, чтобы он содержал только цифры c значения, вам нужно создать собственный столбец для каждого элемента в списках вашего столбца функции. Вы можете сделать это так:

arr = np.concatenate(df_numeric.features.to_numpy()).reshape(df_numeric.shape)
df_sklearn_compatible = pd.concat([pd.DataFrame(arr, columns=["feature_1", "feature_2"]),
                                   df["label"]],
                                  axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...