Ik gebruik sklearn en heb een probleem met de affiniteitspropagatie. Ik heb een invoermatrix gebouwd en ik krijg steeds de volgende foutmelding.
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
Ik heb gelopen
np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True
Ik heb geprobeerd met
mat[np.isfinite(mat) == True] = 0
om de oneindige waarden te verwijderen, maar ook dit werkte niet.
Wat kan ik doen om de oneindige waarden in mijn matrix kwijt te raken, zodat ik het algoritme voor affiniteitspropagatie kan gebruiken?
Ik gebruik anaconda en python 2.7.9.
Antwoord 1, autoriteit 100%
Dit kan gebeuren binnen scikit, en het hangt af van wat je doet. Ik raad aan om de documentatie te lezen voor de functies die je gebruikt. Mogelijk gebruikt u er een die afhangt van b.v. op uw matrix die positief definitief is en niet aan die criteria voldoet.
EDIT: hoe kan ik dat missen:
np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True
is duidelijk verkeerd. Rechts zou zijn:
np.any(np.isnan(mat))
en
np.all(np.isfinite(mat))
U wilt controleren of een van de elementen NaN is, en niet of de geretourneerde waarde van de functie any
een getal is…
Antwoord 2, autoriteit 40%
Ik kreeg dezelfde foutmelding bij het gebruik van sklearn met panda’s. Mijn oplossing is om de index van mijn dataframe df
opnieuw in te stellen voordat een sklearn-code wordt uitgevoerd:
df = df.reset_index()
Ik ben dit probleem vaak tegengekomen toen ik enkele vermeldingen in mijn df
verwijderde, zoals
df = df[df.label=='desired_one']
Antwoord 3, autoriteit 23%
Dit is mijn functie (gebaseerd op dit) om de dataset van nan
, Inf
en ontbrekende cellen op te schonen (voor scheve datasets):
import pandas as pd
def clean_dataset(df):
assert isinstance(df, pd.DataFrame), "df needs to be a pd.DataFrame"
df.dropna(inplace=True)
indices_to_keep = ~df.isin([np.nan, np.inf, -np.inf]).any(1)
return df[indices_to_keep].astype(np.float64)
Antwoord 4, autoriteit 11%
Dit is de controle waarbij het niet lukt:
Wat zegt
def _assert_all_finite(X):
"""Like assert_all_finite, but only for ndarray."""
X = np.asanyarray(X)
# First try an O(n) time, O(1) space solution for the common case that
# everything is finite; fall back to O(n) space np.isfinite to prevent
# false positives from overflow in sum method.
if (X.dtype.char in np.typecodes['AllFloat'] and not np.isfinite(X.sum())
and not np.isfinite(X).all()):
raise ValueError("Input contains NaN, infinity"
" or a value too large for %r." % X.dtype)
Zorg er dus voor dat je niet-NaN-waarden in je invoer hebt. En al die waarden zijn eigenlijk float-waarden. Geen van de waarden mag ook Inf zijn.
Antwoord 5, autoriteit 10%
De afmetingen van mijn invoerarray waren scheef, omdat mijn invoer-csv lege spaties had.
Antwoord 6, autoriteit 7%
In de meeste gevallen lost het verwijderen van oneindige en null-waarden dit probleem op.
verwijder oneindige waarden.
df.replace([np.inf, -np.inf], np.nan, inplace=True)
verwijder null-waarden zoals u dat wilt, specifieke waarde zoals 999, mean, of maak uw eigen functie om ontbrekende waarden toe te rekenen
df.fillna(999, inplace=True)
Antwoord 7, autoriteit 5%
Met deze versie van python 3:
/opt/anaconda3/bin/python --version
Python 3.6.0 :: Anaconda 4.3.0 (64-bit)
Toen ik naar de details van de fout keek, vond ik de coderegels die de fout veroorzaakten:
/opt/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in _assert_all_finite(X)
56 and not np.isfinite(X).all()):
57 raise ValueError("Input contains NaN, infinity"
---> 58 " or a value too large for %r." % X.dtype)
59
60
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
Hieruit kon ik de juiste manier halen om te testen wat er met mijn gegevens aan de hand was met dezelfde test die mislukt door de foutmelding: np.isfinite(X)
Toen kon ik met een snelle en vuile lus ontdekken dat mijn gegevens inderdaad nans
bevatten:
print(p[:,0].shape)
index = 0
for i in p[:,0]:
if not np.isfinite(i):
print(index, i)
index +=1
(367340,)
4454 nan
6940 nan
10868 nan
12753 nan
14855 nan
15678 nan
24954 nan
30251 nan
31108 nan
51455 nan
59055 nan
...
Nu hoef ik alleen nog maar de waarden bij deze indexen te verwijderen.
Antwoord 8, autoriteit 3%
Ik kreeg de fout nadat ik probeerde een subset van rijen te selecteren:
df = df.reindex(index=my_index)
Het blijkt dat my_index
waarden bevatte die niet in df.index
stonden, dus de herindexfunctie heeft enkele nieuwe rijen ingevoegd en deze gevuld met nan
code>.
Antwoord 9, autoriteit 2%
Ik had dezelfde fout, en in mijn geval waren X en y dataframes, dus ik moest ze eerst naar matrices converteren:
X = X.values.astype(np.float)
y = y.values.astype(np.float)
Bewerken: de oorspronkelijk voorgestelde X.as_matrix() is Verouderd
Antwoord 10, autoriteit 2%
Verwijder alle oneindige waarden:
(en vervang door min of max voor die kolom)
import numpy as np
# generate example matrix
matrix = np.random.rand(5,5)
matrix[0,:] = np.inf
matrix[2,:] = -np.inf
>>> matrix
array([[ inf, inf, inf, inf, inf],
[0.87362809, 0.28321499, 0.7427659 , 0.37570528, 0.35783064],
[ -inf, -inf, -inf, -inf, -inf],
[0.72877665, 0.06580068, 0.95222639, 0.00833664, 0.68779902],
[0.90272002, 0.37357483, 0.92952479, 0.072105 , 0.20837798]])
# find min and max values for each column, ignoring nan, -inf, and inf
mins = [np.nanmin(matrix[:, i][matrix[:, i] != -np.inf]) for i in range(matrix.shape[1])]
maxs = [np.nanmax(matrix[:, i][matrix[:, i] != np.inf]) for i in range(matrix.shape[1])]
# go through matrix one column at a time and replace + and -infinity
# with the max or min for that column
for i in range(matrix.shape[1]):
matrix[:, i][matrix[:, i] == -np.inf] = mins[i]
matrix[:, i][matrix[:, i] == np.inf] = maxs[i]
>>> matrix
array([[0.90272002, 0.37357483, 0.95222639, 0.37570528, 0.68779902],
[0.87362809, 0.28321499, 0.7427659 , 0.37570528, 0.35783064],
[0.72877665, 0.06580068, 0.7427659 , 0.00833664, 0.20837798],
[0.72877665, 0.06580068, 0.95222639, 0.00833664, 0.68779902],
[0.90272002, 0.37357483, 0.92952479, 0.072105 , 0.20837798]])
Antwoord 11, autoriteit 2%
Geen van de antwoorden hier werkte voor mij. Dit was wat werkte.
Test_y = np.nan_to_num(Test_y)
Het vervangt de oneindigheidswaarden door hoge eindige waarden en de nan-waarden door getallen
Antwoord 12
ik kreeg dezelfde fout. het werkte met df.fillna(-99999, inplace=True)
voordat vervanging, vervanging enz.
Antwoord 13
In mijn geval was het probleem dat veel scikit-functies numpy-arrays retourneren, die geen panda-index bevatten. Er was dus een mismatch in de index toen ik die numpy-arrays gebruikte om nieuwe DataFrames te bouwen en vervolgens probeerde ik ze te mixen met de originele gegevens.
Antwoord 14
Ik zou graag een oplossing voor numpy willen voorstellen die goed voor mij werkte. De lijn
from numpy import inf
inputArray[inputArray == inf] = np.finfo(np.float64).max
vervangt alle oneindige waarden van een numpy-array met het maximale float64-getal.
Antwoord 15
dataset = dataset.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
Dit werkte voor mij
Antwoord 16
probeer
mat.sum()
Als de som van uw gegevens oneindig is (groter dan de maximale float-waarde die 3.402823e+38 is), krijgt u die fout.
zie de _asset_all_finite functie in validation.py van de scikit-broncode:
if is_float and np.isfinite(X.sum()):
pass
elif is_float:
msg_err = "Input contains {} or a value too large for {!r}."
if (allow_nan and np.isinf(X).any() or
not allow_nan and not np.isfinite(X).all()):
type_err = 'infinity' if allow_nan else 'NaN, infinity'
# print(X.sum())
raise ValueError(msg_err.format(type_err, X.dtype))