Ошибка разных размеров в трубопроводах Feautured - PullRequest
0 голосов
/ 07 ноября 2019

Я абсолютный новичок в ML, и в настоящее время я пытаюсь создать конвейер для своих данных. Но дело в том, что когда я его запустил, я получил ошибку:

ValueError: all the input arrays must have same number of dimensions

Хотя при выполнениивсе по отдельности, без конвейера, все хорошо. Кроме того, я не понимаю проблемы с «ошибкой ввода», потому что я передаю только данные конвейеру. Я создал 3 простых функции, которые также не должны запускатьсяв проблему, потому что я дал им все, что им нужно.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import hashlib
from sklearn.base import BaseEstimator, TransformerMixin

housing = pd.read_csv('housing.csv')

rooms_id, bedrooms_id, population_id, household_id  = 3, 4, 5, 6

class CreateNewAttribute(BaseEstimator, TransformerMixin):
    def __init__(self, bedrooms_per_room=True):
        self.bedrooms_per_room = bedrooms_per_room

    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
        rooms_per_houshold = X[:, rooms_id] / X[:, household_id] # Names say for themselfs,so I won't add the code
        housholds_per_population = X[:, household_id] / X[:, population_id]
        if self.bedrooms_per_room:
            bedrooms_per_room = X[:, bedrooms_id] / X[:, rooms_id]
            return np.c_[X, rooms_per_houshold,
                    housholds_per_population, bedrooms_per_room]
        else:
            return np.c_[X, rooms_per_houshold, housholds_per_population]


class DataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, desired_attributes):
        self.desired_attributes = desired_attributes

    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
        return X[self.desired_attributes].values

numerical_data = list(housing.columns)
del numerical_data[-1]
categorical_att = ['ocean_proximity']

class CustomBinazer(TransformerMixin):
    def __init__(self, *args, **kwargs):
        self.encoder = LabelBinarizer(*args, **kwargs)
    def fit(self, X, y=None):
        self.encoder.fit(X)
        return self
    def transform(self, X, y=None):
        return self.encoder.transform(X)
pipeline_for_num = Pipeline([('selector', DataFrameSelector(numerical_data)),
                            ('Imputer', SimpleImputer(strategy='median')),
                            ('att_adder', CreateNewAttribute()),
                            ('standard_scaler', StandardScaler())
                            ])

pipeline_for_categorical = Pipeline([('selector', DataFrameSelector(categorical_att)),
                                    ('binazer', CustomBinazer(sparse_output=False))
                                    ])

from sklearn.pipeline import FeatureUnion

full_pipeline = FeatureUnion(transformer_list=[('pipline_for_num', pipeline_for_num),
                              ('pipline_for_categorical', pipeline_for_categorical)
                              ])
allThePreapration = full_pipeline.fit_transform(housing)

Если вам нужна дополнительная ясность, у данных, которые я использую, есть соответствующие атрибуты:

['longitude',
 'latitude',
 'housing_median_age',
 'total_rooms',
 'total_bedrooms',
 'population',
 'households',
 'median_income',
'ocea_proximity']

Надеюсь, вы поможете мне,не может решить эту проблему в течение длительного времени.

...