** Я делаю приложение для прогнозирования цен на ноутбуки с помощью ML, и есть много примеров на эту тему. Хоть я и пишу коды точно такие же как и они, но выдают такие ошибки и не знаю как их исправить. это мои коды: **
step1 = ColumnTransformer(transformers=[
('col_tnf',OneHotEncoder(sparse=False,drop='first'),[0,1,7,10,11])],remainder='passthrough')
step2 = LinearRegression()
pipe = Pipeline([
('step1',step1),
('step2',step2)
])
pipe.fit(X_train,y_train)
y_pred = pipe.predict(X_test)
print('R2 score',r2_score(y_test,y_pred))
print('MAE',mean_absolute_error(y_test,y_pred))
И Выход:
Output exceeds the size limit. Open the full output data in a text editor---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[94], line 12
5 step2 = LinearRegression()
7 pipe = Pipeline([
8 ('step1',step1),
9 ('step2',step2)
10 ])
---> 12 pipe.fit(X_train,y_train)
14 y_pred = pipe.predict(X_test)
16 print('R2 score',r2_score(y_test,y_pred))
File c:\Users\...\AppData\Local\Programs\Python\Python39\lib\site-packages\sklearn\pipeline.py:405, in Pipeline.fit(self, X, y, **fit_params)
403 if self._final_estimator != "passthrough":
404 fit_params_last_step = fit_params_steps[self.steps[-1][0]]
--> 405 self._final_estimator.fit(Xt, y, **fit_params_last_step)
407 return self
File c:\Users\...\AppData\Local\Programs\Python\Python39\lib\site-packages\sklearn\linear_model\_base.py:648, in LinearRegression.fit(self, X, y, sample_weight)
644 n_jobs_ = self.n_jobs
646 accept_sparse = False if self.positive else ["csr", "csc", "coo"]
--> 648 X, y = self._validate_data(
649 X, y, accept_sparse=accept_sparse, y_numeric=True, multi_output=True
650 )
652 sample_weight = _check_sample_weight(
...
--> 185 array = numpy.asarray(array, order=order, dtype=dtype)
186 return xp.asarray(array, copy=copy)
187 else:
ValueError: could not convert string to float: 'Intel'
Я думаю, что мне нужно делать преобразование типов, когда я ищу информацию в Интернете, но, честно говоря, я не знаю, где это сделать.
Извините, но как это сделать?
Добавьте еще одну запись в свой ColumnTransformer, чтобы преобразовать столбец, содержащий такие строки, как Intel. Вы должны предоставить вывод print(X_train.head(5).to_dict('list'))
Немного сложно понять, что именно происходит без дополнительного кода, но из того, что я вижу в ваших сообщениях об ошибках, вы определяете X, Y, но где создаются экземпляры X_train, X_test, y_train и y_test?
from scipy.stats import chi2
from sklearn.compose import ColumnTransformer
from sklearn.feature_selection import SelectPercentile
from sklearn.impute import SimpleImputer
from sklearn.metrics import r2_score, mean_absolute_error
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
import pandas as pd
df = pd.read_csv('laptop_data.csv')
# define your X and Y
# numeric data
numeric_features = ["Screen Size", "RAM"]
numeric_transformer = Pipeline(
steps=[
("imputer", SimpleImputer(strategy = "median")),
("scaler", StandardScaler())]
)
# categorical data
categorical_features = ["CPU"]
categorical_transformer = Pipeline(
steps=[
("encoder", OneHotEncoder(handle_unknown = "ignore")),
("selector", SelectPercentile(chi2, percentile=50)),
]
)
preprocessor = ColumnTransformer(
transformers=[
("num", numeric_transformer, numeric_features),
("cat", categorical_transformer, categorical_features),
]
)
pipe = Pipeline([
("preprocessor", preprocessor),
("classifier", LinearRegression())
])
X_train, X_test, y_train, y_test = \
train_test_split(X, Y, test_size=0.2, random_state=30, stratify=Y)
pipe.fit(X_train, y_train)
y_pred = pipe.predict(X_test)
print('R2 score', r2_score(y_test, y_pred))
print('MAE', mean_absolute_error(y_test, y_pred))
Редактировать: я не знаю, как выглядят ваши данные, но вы, вероятно, захотите создать конвейеры предварительной обработки как для числовых, так и для категориальных данных. Я просто использовал ЦП как категориальный, предполагая, что это столбец, содержащий «Intel» и «AMD».
Большое спасибо за вашу помощь, но, к сожалению, я продолжаю получать ошибки. ValueError: не удалось преобразовать строку в число с плавающей запятой: «AMD» на этот раз выдает ошибку из других имен в этом столбце.
Можете ли вы добавить код, показывающий, как вы читаете свои данные?
df = pd.read_csv('ноутбук_data.csv')
Я сделал еще одну правку
это сработало для вас? если да, то примите мой ответ :)
Если вы используете
remainder='passthrough'
, вы должны убедиться, что оставшиеся столбцы являются числовыми, иначе вам придется их преобразовать.ColumnTransformer
удалить оставшиеся столбцы по умолчанию.