ValueError:在 LinearSVC 期间,数组在 _assert_all_finite 中包含 NaN 或无穷大

Posted

技术标签:

【中文标题】ValueError:在 LinearSVC 期间,数组在 _assert_all_finite 中包含 NaN 或无穷大【英文标题】:ValueError: Array contains NaN or infinity in _assert_all_finite during LinearSVC 【发布时间】:2014-02-18 20:03:56 【问题描述】:

我试图对这里的葡萄酒数据集进行分类 -http://archive.ics.uci.edu/ml/datasets/Wine+Quality 使用逻辑回归(使用方法='bfgs'和l1 norm)并捕获奇异值矩阵错误(引发LinAlgError('奇异矩阵'),尽管满秩[我使用np.linalg.matrix_rank(数据[ 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 个标签(来自 range(3,10) How to fix "NaN or infinity" issue for sparse matrix in 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 的思考过程是否正确,考虑到我的用例,还是应该使用网格搜索?

免责声明:此代码的部分内容是基于 *** 和其他来源的类似上下文中的建议构建的 - 我的真实用例只是尝试访问此方法是否适合我的场景。就是这样。

【问题讨论】:

@AndreasMueller - 看起来您只是向后阅读帖子,而您没有阅读问题的核心 - 这是“试验”我是否确实具有其特征的线性组合。无论如何,感谢您提到 pandas 不支持 scikit-learn - 我认为这可能会导致某些事情。 PPS:我非常了解我在这里输入的每一段代码——除了我不知道的数据帧不匹配。 我的帖子被删除了吗?好吧,我确实回答了有关您的问题的问题,这与您帖子的“核心”无关。如果我冒犯了您,我很抱歉,但作为免责声明说您从 *** 复制代码给人的印象是您没有这样做。顺便说一句,代码仍然无效。 【参考方案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'>

这个 hack 来自这篇文章 http://python.dzone.com/articles/python-making-scikit-learn-and 和 @AndreasMueller - 他们指出了不一致之处。

【讨论】:

以上是关于ValueError:在 LinearSVC 期间,数组在 _assert_all_finite 中包含 NaN 或无穷大的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ```pandas.read_json(...)` 期间修复 ```ValueError: Trailing data```?

Scikit Learn OneHotEncoder 拟合和变换错误:ValueError:X 的形状与拟合期间不同

DTreeViz 命令期间训练数据出现 ValueError

为啥 LinearSVC 在这个数据集上效果这么差?

sklearn:评估 LinearSVC AUC

在 python 中使用带有 LinearSVC 的特征选择