Как исправить ошибку типа TypeError: неподдерживаемые типы операндов для -: 'str' и 'str' - PullRequest
0 голосов
/ 05 июля 2019

Я пытался реализовать модель полиномиальной регрессии в python в IDE spyder, все работает хорошо, и в конце, когда я пытаюсь добавить функцию упорядочения из numpy, она выдает мне следующую ошибку !!

import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np

dataset = pd.read_csv("Position_Salaries.csv")
X = dataset.iloc[:, 1:2]
y = dataset.iloc[:, 2]

#fitting the linear regression model
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)

#fitting the polynomial linear Regression
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = 4)
X_poly = poly_reg.fit_transform(X)
lin_reg2 = LinearRegression()
lin_reg2.fit(X_poly,y)

#visualising the linear regression results
plt.scatter(X,y ,color = 'red')
plt.plot(X,lin_reg.predict(X), color='blue')
plt.title('linear regression model')
plt.xlabel('positive level')
plt.ylabel('salary')
plt.show()

#the code doesnt work here on this np.arrange linee !!!
#visualisng the polynomial results
X_grid = np.arange(min(X),max(X), 0.1)
X_grid = X_grid.reshape((len(X_grid), 1))
plt.scatter(X,y ,color = 'red')
plt.plot(X_grid,lin_reg2.predict( poly_reg.fit_transform(X_grid)), color='blue')
plt.title('linear regression model')
plt.xlabel('positive level')
plt.ylabel('salary')
plt.show()

он должен работать и выполняться без ошибок!

Ответы [ 3 ]

0 голосов
/ 05 июля 2019

Вы должны проверить, что находится в X и Y. Вероятно, это объекты серии, содержащие строки. Вам нужно извлечь значения в X и y и преобразовать их в числа с плавающей запятой, прежде чем что-либо делать с ними.

Что-то вроде:

X = dataset.iloc[:, 1:2].astype(float)
y = dataset.iloc[:, 2].astype(float)
0 голосов
/ 06 июля 2019

Если эта ошибка возникает в:

np.arange(min(X),max(X), 0.1)

это должно быть потому, что min(X) и max(X) являются строками.

In [385]: np.arange('123','125')                                                                                
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-385-0a55b396a7c3> in <module>
----> 1 np.arange('123','125')

TypeError: unsupported operand type(s) for -: 'str' and 'str'

Поскольку X является pandas объектом (фреймом данных или серией?), Это не так уж удивительно. pandas свободно использует объект dtype, когда не может использовать число (и не использует пустую строку dtype):

X = dataset.iloc[:, 1:2]

np.arange(np.array('123'),np.array('125')) выдает другую ошибку, касающуюся типов U3.

Тот факт, что вызовы LinearRegresion работают с этим X, немного озадачивает, но я не знаю, как он дезинфицирует свои входные данные.

В любом случае, я бы проверил min(X) перед вызовом arange, посмотрев на его значение и тип. Если это строка, изучите X более подробно.


В комментарии вы говорите: there are two columns and all have integers from 1-10 and 45k to 100k. Это 45k целое число или строка?


Давайте проведем тест на фиктивном фрейме данных:

In [392]: df = pd.DataFrame([[1,45000],[2,46000],[3,47000]], columns=('A','B'))                                 
In [393]: df                                                                                                    
Out[393]: 
   A      B
0  1  45000
1  2  46000
2  3  47000
In [394]: min(df)                                                                                               
Out[394]: 'A'
In [395]: max(df)                                                                                               
Out[395]: 'B'

min и max создают строки - производные от имен столбцов.

В отличие от этого fit функции, вероятно, работают со значениями массива кадра данных:

In [397]: df.to_numpy()                                                                                         
Out[397]: 
array([[    1, 45000],
       [    2, 46000],
       [    3, 47000]])

Не думайте, что все должно работать! Проверка, отладка, печать подозрительных значений.


min/max - функции Python. Цифровые работают с чувствительностью к фрейму данных -

In [399]: np.min(df)      # delegates to df.min()                                                                                      
Out[399]: 
A        1
B    45000
dtype: int64
In [400]: np.max(df)                                                                                            
Out[400]: 
A        3
B    47000
dtype: int64

хотя они не являются подходящими для arange.

Что именно вы намереваетесь произвести с этим arange звонком?

arange в диапазоне один столбец работающего кадра данных:

In [405]: np.arange(np.min(df['A']), np.max(df['A']),.1)                                                        
Out[405]: 
array([1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2,
       2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])
0 голосов
/ 05 июля 2019

Вы должны убедиться, что все ваши входы имеют правильный тип.Мне кажется, что типы для операции str.Может быть, попытаться преобразовать их в числа с плавающей точкой с помощью float(x) или с помощью некоторых подобных функций?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...