Я абсолютный новичок в 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']
Надеюсь, вы поможете мне,не может решить эту проблему в течение длительного времени.