0

Ich habe ein Dataset, das numerische und Objekt in den Features enthält. Einige der Features mit Objektdatentyp haben darüber hinaus fehlende Werte. Ich habe eine modifizierte Version von Imputer (nach den Anweisungen in einem anderen Beitrag) erstellt, um den fehlenden Wert für den numerischen und den kategorialen Datentyp zu berücksichtigen, aber wenn ich ihn auf meine Datenmenge anwende, wird AttributeError zurückgegeben. Ich glaube, ich mache einen dummen Fehler in der Definition der Fit-Methode für die Imputation und ich schätze Ihre Einsicht. Hier ist der mein Code und der Fehler:Wie man Spalten mit kategorialem Datentyp in scikit-learn impliziert

import os 
import pandas as pd 
import numpy as np 
from sklearn.preprocessing import Imputer 

#load the data 
path='~/Desktop/ML/Hands_on/housing_train.csv' 
path=os.path.expanduser(path) 
data=pd.read_csv(path) 

#select the columns_names including dtype=object && missing data 
object_data=data.select_dtypes(include=['object']) 
object_data_null=[] 
for col in object_data.columns: 
    if object_data[col].isnull().any(): 
     object_data_null.append(col) 

class GeneralImputer(Imputer): 
    def __init__(self, **kwargs): 
     Imputer.__init__(self, **kwargs) 

    def fit(self, X, y=None): 
     if self.strategy == 'most_frequent': 
      self.fills = pd.DataFrame(X).mode(axis=0).squeeze() 
      self.statistics_ = self.fills.values 
      return self 
     else: 
      return Imputer.fit(self, X, y=y) 

    def transform(self, X): 
     if hasattr(self, 'fills'): 
      return pd.DataFrame(X).fillna(self.fills).values.astype(str) 
     else: 
      return Imputer.transform(self, X) 

imputer=GeneralImputer(strategy='most_frequent', axis=1) 

for i in object_data_null: 
    imputer.fit(data[i]) 
    data[i]=imputer.transform(data[i]) 


--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-29-989e78355872> in <module>() 
    38 object_data_null 
    39 for i in object_data_null: 
---> 40  imputer.fit(data[i]) 
    41  data[i]=imputer.transform(data[i]) 
    42 

<ipython-input-29-989e78355872> in fit(self, X, y) 
    23   if self.strategy == 'most_frequent': 
    24    self.fills = pd.DataFrame(X).mode(axis=0).squeeze() 
---> 25    self.statistics_ = self.fills.values 
    26    return self 
    27   else: 

AttributeError: 'str' object has no attribute 'values' 

Antwort

1

Für ein 1-sized Objekt der squeeze() Verfahren ein Scaler-Objekt als mentioned in the documentation

zurückkehren So bedeutet, dass für die meiste Zeit (die für alle geschieht Spalten), der Modus einer Spalte ist ein einzelnes Objekt und dann wird die Squeeze() nur die Zeichenfolge zurückgeben.

So brauchen Sie nicht .values danach zu bekommen. Ändern Sie Ihre fit() - Methode, um das zu entfernen:

def fit(self, X, y=None): 
    if self.strategy == 'most_frequent': 
     self.fills = pd.DataFrame(X).mode(axis=0).squeeze() 

     # Removed .values from the below line 
     self.statistics_ = self.fills 
     return self 
+0

Vielen Dank @Vivek Kumar –

Verwandte Themen