【问题标题】:How to convert str into float? ValueError: could not convert string to float: '0,25691372'如何将str转换为float? ValueError:无法将字符串转换为浮点数:'0,25691372'
【发布时间】:2020-02-10 04:29:51
【问题描述】:

我使用 XGBoost 来衡量特征重要性,我想选择给我 90% 重要性的特征,所以首先我构建了一个 Dataframe,因为我需要它用于 excel,然后我编写了一个循环来评估给我 90% 的重要性的功能。在此之后有一个神经网络(但它不在下面的代码中)。我知道也许有一些最简单的方法可以做到这一点,但它给了我一个错误:

ValueError: could not convert string to float: '0,25691372'

代码是

  import pandas as pd
import numpy as np

from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import SelectFromModel
from sklearn import preprocessing

from sklearn.model_selection import train_test_split
from xgboost import XGBRegressor
from matplotlib import pyplot as plt


dataset = pd.read_csv('CompleteDataSet_original_Clean_CONC.csv', decimal=',', delimiter = ";")
from sklearn.metrics import r2_score

label = dataset.iloc[:,-1]
features = dataset.drop(columns = ['Label'])
y_max_pre_normalize = max(label)
y_min_pre_normalize = min(label)

def denormalize(y):
    final_value = y*(y_max_pre_normalize-y_min_pre_normalize)+y_min_pre_normalize
    return final_value
X_train1, X_test1, y_train1, y_test1 = train_test_split(features, label, test_size = 0.20, random_state = 1, shuffle = True)

y_test2 = y_test1.to_frame()
y_train2 = y_train1.to_frame()

scaler1 = preprocessing.MinMaxScaler()
scaler2 = preprocessing.MinMaxScaler()
X_train = scaler1.fit_transform(X_train1)
X_test = scaler2.fit_transform(X_test1)


scaler3 = preprocessing.MinMaxScaler()
scaler4 = preprocessing.MinMaxScaler()
y_train = scaler3.fit_transform(y_train2)
y_test = scaler4.fit_transform(y_test2)


sel = XGBRegressor(colsample_bytree= 0.7, learning_rate = 0.005, max_depth = 5, min_child_weight = 3, n_estimators = 1000)
sel.fit(X_train, y_train)
importances = sel.feature_importances_

importances = [str(i) for i in importances]

importances = [i.replace(".", ",") for i in importances]

df1 = pd.DataFrame(features.columns)
df1.columns = ['Features']
df2 = pd.DataFrame(importances)
df2.columns = ['Importances [%]']
result = pd.concat([df1,df2],axis = 1)
result = result.sort_values(by='Importances [%]', ascending=False)

result.to_excel("Feature_Results.xlsx") 

i = 0
somma = 0
feature = []
while somma <=0.9:
    a = result.iloc[i,-1]
    somma = float(a) + somma
    feature.append(result.iloc[i,-2])
    i = i + 1

【问题讨论】:

  • , 替换为.?
  • 我只浏览了代码,但似乎str(i).replace(".", ",") for i in importances 是问题的根源。你为什么这样做?
  • 是的,问题是这样的。我这样做是因为我需要将此数据框导出到 excel 中。所以我更喜欢将“,”作为小数分隔符
  • 顺便说一句,为什么要在创建 DataFrames 后分配列名?做df1 = pd.DataFrame(features.columns); df1.columns = ['Features'] 而不是df_1 = pd.DataFrame(features.columns, columns=['Features']) 对我来说没有多大意义。对于importances, 的两个不同的列表理解也是一样的,应该很容易改变。

标签: python machine-learning neural-network spyder xgboost


【解决方案1】:
float('0,25691372'.replace(",", "."))

【讨论】:

    【解决方案2】:

    您可以使用locale.atof() 来处理, 作为小数分隔符。

    import locale
    locale.setlocale(locale.LC_ALL, 'fr_FR')
    ...
        somma = locale.atof(a) + somma
    

    【讨论】:

    • 而使用 atof 的原因是小数点分隔符取决于语言环境 - 问题中给出的打印版本适用于使用 , 而不是 . 的语言环境 - 而 python 可以在调用 float 时不要直接解析它 - 因为它期望 . 代替。
    • 我尝试了您的解决方案,但它不起作用。错误是错误:不支持的区域设置。我该如何解决?
    • 您的机器上可能没有安装语言环境。你可以检查locale -a并安装它stackoverflow.com/questions/14547631/…
    • @GabrieleValvo fr_FR 只是一种可能的选择。使用您正在使用的任何语言环境,无论是 it_IT(意大利语)、de_DE(德语)、de_CH(瑞士德语)...
    • 是的,但我不知道如何安装它。我必须使用提示符吗?
    【解决方案3】:

    尝试将“0,0001”转换为“0.0001”,然后将字符串转换为浮点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2018-06-13
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多