Apple Turi Create图像分类器报错:需使用dropna()处理缺失目标值
解决Turi Create图像分类器中Target列缺失值的问题
首先咱们揪出问题的核心:你新增了5个类别,但data.py里的labels列表还是原来的4个类别(['A', 'B', 'C', 'D']),这就导致新增类别的图片在调用get_label时找不到匹配标签,返回了None,最终造成label列出现缺失值,触发了这个错误。
第一步:从根源避免缺失值——修复标签生成逻辑
推荐用你注释掉的自动从路径提取标签的方法,这样不用手动维护labels列表,新增类别时也不会遗漏:
修改data.py的标签生成部分:
import turicreate as tc import os image_data = tc.image_analysis.load_images('images', with_path=True) # 自动从文件夹路径提取标签,无需手动维护类别列表 image_data['label'] = image_data['path'].apply(lambda path: os.path.dirname(path).split('/')[-1]) image_data.save('boxes.sframe') image_data.explore()
只要你的图片是按类别放在对应文件夹里,这个方法就能自动提取正确标签,从根源避免缺失值的产生。
第二步:正确使用dropna()清理残留缺失值
如果还是担心有异常图片导致的缺失值,要在分割训练测试集之前调用dropna(),并且要指定清理label列的缺失值,同时把结果赋值回原变量(因为dropna()默认返回新的SFrame,不会修改原数据):
修改train.py:
import turicreate as tc data = tc.SFrame('boxes.sframe') # 明确删除label列存在缺失值的行 data = data.dropna(column_names=['label']) train_data, test_data = data.random_split(0.8) model = tc.image_classifier.create(train_data, target='label', max_iterations=1000) predictions = model.classify(test_data) results = model.evaluate(test_data) print "Accuracy : %s" % results['accuracy'] print "Confusion Matrix : \n%s" % results['confusion_matrix'] model.save('boxes.model')
你之前的data.dropna()没有赋值,等于白调用了,原data并没有被修改,这也是问题持续存在的原因之一。
关于max_iterations=1000的疑问
这个参数完全不会导致你遇到的缺失值错误,它只是控制模型训练时的迭代次数——数值越大训练时间越长,可能模型精度会更高,但和数据的缺失值问题没有任何关系。
内容的提问来源于stack exchange,提问作者Alessign
相关产品推荐
相关产品推荐

