Не удалось преобразовать строку в плавающую в записной книжке jupyter

#python #machine-learning #scikit-learn

Вопрос:

Я пытаюсь создать модель ML , но у меня возникли проблемы с этой функцией. Данная ошибка говорит о том , что не удается преобразовать строку в float. Я попытался использовать метод преобразования, но он все еще не работает. Этот код пытается создать модель ml

 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

crime_data= pd.read_csv('Crime_Data_from_2020_to_Present.csv')
#offense= crime_data['Crm Cd Desc']
myData= crime_data.drop(columns=['DR_NO','Date Rptd','Rpt Dist No','Part 1-2','Crm Cd','Mocodes','Vict Age','Vict Sex','Vict Descent','Premis Desc','Weapon Used Cd','Weapon Desc','Status','Status Desc','Crm Cd 1','Crm Cd 2','Crm Cd 3','Crm Cd 4','Cross Street','Premis Cd'])
myData['DATE OCC'] = myData['DATE OCC'].astype(float)#method for converting not working

X= myData.drop (columns=['AREA NAME']) #input data
y= myData['AREA NAME'] #output data

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
classifier = RandomForestClassifier(n_estimators = 50)
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
y_pred
 

Это ошибка, которую я получаю

 ValueError                                Traceback (most recent call last)
<ipython-input-16-20d49933ca7e> in <module>
  9 #offense= crime_data['Crm Cd Desc']
 10 myData= crime_data.drop(columns=['DR_NO','Date Rptd','Rpt Dist No','Part 1-2','Crm Cd','Mocodes','Vict Age','Vict Sex','Vict Descent','Premis Desc','Weapon Used Cd','Weapon Desc','Status','Status Desc','Crm Cd 1','Crm Cd 2','Crm Cd 3','Crm Cd 4','Cross Street','Premis Cd'])
 ---> 11 myData['DATE OCC'] = myData['DATE OCC'].astype(float)#method for converting not working
 12 
 13 X= myData.drop (columns=['AREA NAME']) #input data

 ~anaconda3libsite-packagespandascoregeneric.py in astype(self, dtype, copy, errors)
 5696         else:
 5697             # else, only a single dtype is given
 -> 5698             new_data = self._data.astype(dtype=dtype, copy=copy, errors=errors)
 5699             return self._constructor(new_data).__finalize__(self)
 5700 

 ~anaconda3libsite-packagespandascoreinternalsmanagers.py in astype(self, dtype, copy, errors)
580 
581     def astype(self, dtype, copy: bool = False, errors: str = "raise"):
--> 582         return self.apply("astype", dtype=dtype, copy=copy, errors=errors)
583 
584     def convert(self, **kwargs):

~anaconda3libsite-packagespandascoreinternalsmanagers.py in apply(self, f, filter, **kwargs)
440                 applied = b.apply(f, **kwargs)
441             else:
--> 442                 applied = getattr(b, f)(**kwargs)
443             result_blocks = _extend_blocks(applied, result_blocks)
444 

~anaconda3libsite-packagespandascoreinternalsblocks.py in astype(self, dtype, copy, errors)
623             vals1d = values.ravel()
624             try:
--> 625                 values = astype_nansafe(vals1d, dtype, copy=True)
626             except (ValueError, TypeError):
627                 # e.g. astype_nansafe can fail on object-dtype of strings

~anaconda3libsite-packagespandascoredtypescast.py in astype_nansafe(arr, dtype, copy, skipna)
895     if copy or is_object_dtype(arr) or is_object_dtype(dtype):
896         # Explicit copy, or required since NumPy can't view from / to object.
--> 897         return arr.astype(dtype, copy=True)
898 
899     return arr.view(dtype)

ValueError: could not convert string to float: '01/08/2020 12:00:00 AM'
 

Я изменил код на этот

 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

crime_data= pd.read_csv('Crime_Data_from_2020_to_Present.csv')
#offense= crime_data['Crm Cd Desc']
myData= crime_data.drop(columns=['DR_NO','Date Rptd','Rpt Dist No','Part 1-2','Crm Cd','Mocodes','Vict Age','Vict Sex','Vict Descent','Premis Desc','Weapon Used Cd','Weapon Desc','Status','Status Desc','Crm Cd 1','Crm Cd 2','Crm Cd 3','Crm Cd 4','Cross Street','Premis Cd'])
myData['DATE OCC'] = pd.to_datetime(myData['DATE OCC'])#method for converting not working

X= myData.drop (columns=['AREA NAME']) #input data
y= myData['AREA NAME'] #output data

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
classifier = RandomForestClassifier(n_estimators = 50)
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
y_pred
 

Но потом я получаю эту ошибку. Пожалуйста, помогите

  TypeError                                 Traceback (most recent call last)
 <ipython-input-17-18d34976fcb7> in <module>
 16 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
 17 classifier = RandomForestClassifier(n_estimators = 50)
 ---> 18 classifier.fit(X_train, y_train)
 19 y_pred = classifier.predict(X_test)
 20 y_pred

 ~anaconda3libsite-packagessklearnensemble_forest.py in fit(self, X, y, sample_weight)
301                 "sparse multilabel-indicator for y is not supported."
302             )
--> 303         X, y = self._validate_data(X, y, multi_output=True,
304                                    accept_sparse="csc", dtype=DTYPE)
305         if sample_weight is not None:

~anaconda3libsite-packagessklearnbase.py in _validate_data(self, X, y, reset, validate_separately, **check_params)
430                 y = check_array(y, **check_y_params)
431             else:
--> 432                 X, y = check_X_y(X, y, **check_params)
433             out = X, y
434 

 ~anaconda3libsite-packagessklearnutilsvalidation.py in inner_f(*args, **kwargs)
 71                           FutureWarning)
 72         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
 ---> 73         return f(**kwargs)
 74     return inner_f
 75 

~anaconda3libsite-packagessklearnutilsvalidation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, estimator)
794         raise ValueError("y cannot be None")
795 
--> 796     X = check_array(X, accept_sparse=accept_sparse,
797                     accept_large_sparse=accept_large_sparse,
798                     dtype=dtype, order=order, copy=copy,

~anaconda3libsite-packagessklearnutilsvalidation.py in inner_f(*args, **kwargs)
 71                           FutureWarning)
 72         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
 ---> 73         return f(**kwargs)
 74     return inner_f
 75 

 ~anaconda3libsite-packagessklearnutilsvalidation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator)enter code here
532 
533         if all(isinstance(dtype, np.dtype) for dtype in dtypes_orig):
--> 534             dtype_orig = np.result_type(*dtypes_orig)
535 
536     if dtype_numeric:

<__array_function__ internals> in result_type(*args, **kwargs)

TypeError: invalid type promotion
 

Комментарии:

1. Это scikit-learn вопрос, и он не имеет ничего общего с jupyter-notebook или anaconda ; пожалуйста, обратите внимание на свои теги, они здесь не просто так (отредактировано).

2. Пожалуйста, опубликуйте образец, чтобы мы могли увидеть, как выглядят ваши данные.

Ответ №1:

В вашем наборе данных есть столбец с именем DATE OCC , в котором указаны дата и время. Вы получаете эту ошибку, потому что ваша модель ожидает значения с плавающей точкой, а DATE OCC столбец, который у вас есть, имеет формат object или datetime64 . Поэтому вам нужно добавить этот код, который я упомянул ниже:

 myData['DATE OCC'] = myData['DATE OCC'].astype('datetime64')

myData['day'] = myData['DATE OCC'].dt.day
myData['month'] = myData['DATE OCC'].dt.month
myData['Year'] = myData['DATE OCC'].dt.year

del myData['DATE OCC']

myData = pd.get_dummies(myData)

X= myData.drop(columns=['AREA NAME']) #input data
y= myData['AREA NAME'] #output data