ValueError: массив содержит NaN или бесконечность в _assert_all_finite во время LinearSVC

Я пытался классифицировать набор данных о вине здесь - http://archive.ics.uci.edu/ml/datasets/Wine+Quality с использованием логистической регрессии (с методом = 'bfgs' и нормой l1) и обнаружил ошибку матрицы единственного числа (поднять LinAlgError('Особая матрица'), несмотря на полного ранга [который я тестировал, используя np.linalg.matrix_rank(data[train_cols].values)] .

Вот как я пришел к выводу, что некоторые функции могут быть линейными комбинациями других. Для этого я экспериментировал с использованием Grid search/LinearSVC - и я получаю сообщение об ошибке ниже вместе с моим кодом и набором данных.

Я вижу, что только 6/7 функций на самом деле «независимы», что я интерпретирую при сравнении строк x_train_new[0] и x_train (поэтому я могу определить, какие столбцы являются избыточными).

    # Train & test DATA CREATION
    from sklearn.svm import LinearSVC
    import numpy, random
    import pandas as pd
    df = pd.read_csv("https://github.com/ekta1007/Predicting_wine_quality/blob/master/wine_red_dataset.csv")
#,skiprows=0, sep=',')


    df=df.dropna(axis=1,how='any') # also tried how='all' - still get NaN errors as below
    header=list(df.columns.values) # or df.columns
    X = df[df.columns - [header[-1]]] # header[-1] = ['quality'] - this is to make the code genric enough
    Y = df[header[-1]] # df['quality']
    rows = random.sample(df.index, int(len(df)*0.7)) # indexing the rows that will be picked in the train set
    x_train, y_train = X.ix[rows],Y.ix[rows] # Fetching the data frame using indexes
    x_test,y_test  = X.drop(rows),Y.drop(rows)


# Training the classifier using C-Support Vector Classification.
clf = LinearSVC(C=0.01, penalty="l1", dual=False) #,tol=0.0001,fit_intercept=True, intercept_scaling=1)
clf.fit(x_train, y_train)
x_train_new = clf.fit_transform(x_train, y_train)
#print x_train_new #works
clf.predict(x_test) # does NOT work and gives NaN errors for some x_tests


clf.score(x_test, y_test) # Does NOT work
clf.coef_ # Works, but I am not sure, if this is OK, given huge NaN's - or does the coef's get impacted ?

clf.predict(x_train)
552   NaN
209   NaN
427   NaN
288   NaN
175   NaN
427   NaN
748     7
552   NaN
429   NaN
[... and MORE]
Name: quality, Length: 1119

clf.predict(x_test)
76    NaN
287   NaN
420     7
812   NaN
443     7
420     7
430   NaN
373     5
624     5
[..and More]
Name: quality, Length: 480

Странно то, что когда я запускаю clf.predict(x_train), я все еще вижу некоторые NaN. Что я делаю неправильно? Ведь модель была обучена с использованием этого, и этого НЕ должно происходить, верно?

Согласно этой ветке, я также проверил, что в моем CSV-файле нет пустых значений (хотя я переименовал "качество" только на метки 5 и 7 (из диапазона (3,10) Как исправить проблему NaN или бесконечности для разреженной матрицы в python ?

Также - вот тип данных x_test и y_test/train...

x_test
<class 'pandas.core.frame.DataFrame'>
Int64Index: 480 entries, 1 to 1596
Data columns:
alcohol                 480  non-null values
chlorides               480  non-null values
citric acid             480  non-null values
density                 480  non-null values
fixed acidity           480  non-null values
free sulfur dioxide     480  non-null values
pH                      480  non-null values
residual sugar          480  non-null values
sulphates               480  non-null values
total sulfur dioxide    480  non-null values
volatile acidity        480  non-null values
dtypes: float64(11)

y_test
1     5
10    5
18    5
21    5
30    5
31    7
36    7
40    5
50    5
52    7
53    5
55    5
57    5
60    5
61    5
[..And MORE]
Name: quality, Length: 480

и наконец..

clf.score(x_test, y_test)

Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    clf.score(x_test, y_test)
  File "C:\Python27\lib\site-packages\sklearn\base.py", line 279, in score
    return accuracy_score(y, self.predict(X))
  File "C:\Python27\lib\site-packages\sklearn\metrics\metrics.py", line 742, in accuracy_score
    y_true, y_pred = check_arrays(y_true, y_pred)
  File "C:\Python27\Lib\site-packages\sklearn\utils\validation.py", line 215, in check_arrays
  File "C:\Python27\Lib\site-packages\sklearn\utils\validation.py", line 18, in _assert_all_finite
ValueError: Array contains NaN or infinity.


#I also explicitly checked for NaN's as here -:
for i in df.columns:
    df[i].isnull()

Совет. Пожалуйста, также укажите, правильно ли я думаю об использовании LinearSVC, учитывая мой вариант использования, или мне следует использовать Grid-search?

Отказ от ответственности. Части этого кода были построены на предложениях в аналогичных контекстах из StackOverflow и других источников. Мой реальный вариант использования — это просто попытка доступа, подходит ли этот метод для моего сценария. Это все.


person ekta    schedule 27.01.2014    source источник
comment
@AndreasMueller - Похоже, вы прочитали сообщение только задом наперёд и не прочитали суть проблемы, которая заключалась в том, чтобы экспериментировать, есть ли у меня линейные комбинации их функций. В любом случае, спасибо, что упомянули, что pandas не сочетается с scikit-learn — я думаю, это может к чему-то привести. PPS: я очень хорошо понимаю КАЖДЫЙ фрагмент кода, который я помещаю сюда, кроме несоответствия фрейма данных, о котором я не знал.   -  person ekta    schedule 28.01.2014
comment
Мой пост удалили? Что ж, я ответил на вопрос о вашей проблеме, который не имел ничего общего с сутью вашего поста. Извините, если я вас обидел, но заявление об отказе от ответственности, что вы скопировали код из stackoverflow, создает впечатление, что это не так. Кстати, код все еще недействителен для python.   -  person Andreas Mueller    schedule 31.01.2014


Ответы (1)


Это сработало. Единственное, что мне пришлось действительно изменить, это использовать x_test*.values* вместе с остальными пандами Dataframes(x_train, y_train, y_test) . Как уже указывалось, единственной причиной была несовместимость между pandas df и scikit-learn (который использует массивы numpy)

 #changing your Pandas Dataframe elegantly to work with scikit-learn by transformation to  numpy arrays
>>> type(x_test)
<class 'pandas.core.frame.DataFrame'>
>>> type(x_test.values)
<type 'numpy.ndarray'>

Этот хак взят из этого поста http://python.dzone.com/articles/python-making-scikit-learn-and и @AndreasMueller, которые указали на несоответствие.

person ekta    schedule 28.01.2014