ValueError: не удалось преобразовать строку в число с плавающей запятой: «Intel»

** Я делаю приложение для прогнозирования цен на ноутбуки с помощью 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'

Я думаю, что мне нужно делать преобразование типов, когда я ищу информацию в Интернете, но, честно говоря, я не знаю, где это сделать.

Если вы используете remainder='passthrough', вы должны убедиться, что оставшиеся столбцы являются числовыми, иначе вам придется их преобразовать. ColumnTransformer удалить оставшиеся столбцы по умолчанию.

Corralien 10.04.2023 23:39

Извините, но как это сделать?

nesly 10.04.2023 23:45

Добавьте еще одну запись в свой ColumnTransformer, чтобы преобразовать столбец, содержащий такие строки, как Intel. Вы должны предоставить вывод print(X_train.head(5).to_dict('list'))

Corralien 10.04.2023 23:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Немного сложно понять, что именно происходит без дополнительного кода, но из того, что я вижу в ваших сообщениях об ошибках, вы определяете 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» на этот раз выдает ошибку из других имен в этом столбце.

nesly 11.04.2023 00:07

Можете ли вы добавить код, показывающий, как вы читаете свои данные?

harriet 11.04.2023 00:18

df = pd.read_csv('ноутбук_data.csv')

nesly 11.04.2023 00:27

Я сделал еще одну правку

harriet 12.04.2023 00:36

это сработало для вас? если да, то примите мой ответ :)

harriet 13.04.2023 17:04

Другие вопросы по теме