项目场景:
利用sklearn库构建决策树,使用sklearn.tree.DecisionTreeClassifier()提供的方法----fit()决策树可视化的时候,我们看到程序报错了
问题描述
ValueError: could not convert string to float: ‘young’.
原因分析:
因为在fit()函数不能接收string类型的数据,通过打印的信息可以看到,数据都是string类型的。在使用fit()函数之前,我们需要对数据集进行编码,这里可以使用两种方法:
- LabelEncoder:将字符串转换为增量值
- OneHotEncoder:使用One-of-K算法将字符串转换为整数
解决方案:
为了对string类型的数据序列化,需要先生成pandas数据,这样方便我们的序列化工作
原始数据->字典->pandas数据,编写代码如下:
# -------------------------------原始数据->字典->pandas----------------------------------
lenses_target = [] # 提取每组数据的类别,保存在列表里
for each in lenses:
lenses_target.append(each[-1])
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate'] # 特征标签
lenses_list = [] # 保存lenses数据的临时列表
lenses_dict = {} # 保存lenses数据的字典,用于生成pandas
for each_label in lensesLabels: # 提取信息,生成字典
for each in lenses:
lenses_list.append(each[lensesLabels.index(each_label)])
lenses_dict[each_label] = lenses_list
lenses_list = []
print(lenses_dict) # 打印字典信息
lenses_pd = pd.DataFrame(lenses_dict) # 生成pandas.DataFrame
print(lenses_pd) # 打印pandas.DataFrame
# ---------------------------------------序列化---------------------------------
le = LabelEncoder() # 创建LabelEncoder()对象,用于序列化
for col in lenses_pd.columns: # 为每一列序列化
lenses_pd[col] = le.fit_transform(lenses_pd[col])
print(lenses_pd)
总结
至此 我们就已经将对string类型的数据序列化了