Python机器学习报错求助:ValueError无法将字符串转为浮点
解决ValueError: could not convert string to float: 'Bright Green'问题
错误原因
你用于训练的特征集X包含字符串类型的name列(例如"Bright Green"),而Scikit-learn的LogisticRegression模型仅支持数值型输入,无法自动将字符串转换为浮点数,因此触发该错误。
解决方案
以下提供三种可行的解决方式,按实用性排序:
方案3:基于关键词提取特征(最优)
观察数据可发现,所有半透明颜色的名称均包含"Trans"关键词,直接提取该特征即可完成分类,准确率接近100%:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score data = pd.read_csv('colors_without_rgb.csv') # 从name列提取是否包含"Trans"的特征,转为整数类型 data['has_trans'] = data['name'].str.contains('Trans', case=False).astype(int) X = data[["has_trans"]] # 将目标变量的't'/'f'转为1/0,适配模型要求 y = data['is_trans'].map({'t': 1, 'f': 0}) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) accuracy = accuracy_score(y_test, predictions) print(f"Accuracy: {accuracy:.2f}")
方案1:使用唯一标识id作为特征
每个颜色对应唯一的id,直接用id作为输入特征即可规避字符串问题:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score data = pd.read_csv('colors_without_rgb.csv') # 仅保留id列作为特征 X = data[["id"]] y = data['is_trans'].map({'t': 1, 'f': 0}) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) accuracy = accuracy_score(y_test, predictions) print(f"Accuracy: {accuracy:.2f}")
方案2:对name列进行独热编码
若需直接使用颜色名称作为特征,可通过独热编码将字符串转换为模型可识别的数值型特征:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline data = pd.read_csv('colors_without_rgb.csv') X = data[["name"]] y = data['is_trans'].map({'t': 1, 'f': 0}) # 创建预处理管道,对name列执行独热编码 preprocessor = ColumnTransformer( transformers=[ ('category_encoder', OneHotEncoder(handle_unknown='ignore'), ['name']) ]) # 构建包含预处理和模型的完整管道 model = Pipeline(steps=[ ('preprocessor', preprocessor), ('classifier', LogisticRegression()) ]) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model.fit(X_train, y_train) predictions = model.predict(X_test) accuracy = accuracy_score(y_test, predictions) print(f"Accuracy: {accuracy:.2f}")
内容的提问来源于stack exchange,提问作者EdwardTheTrain
相关产品推荐
相关产品推荐

