机器学习数据预处理定义数值区间及逻辑回归泛化问题咨询
问题解答
1. 未训练年龄为2的样本仍得到正确预测的原因
你使用的逻辑回归模型属于线性分类器,它不会死板地只记住训练时见过的样本值,而是会从训练数据中学习到特征(年龄)和标签(输出)之间的通用规律:
- 训练过程中模型会拟合出一个决策边界,大概在年龄=15的位置
- 只要输入的年龄远小于15,无论这个值有没有在训练集中出现,模型都会根据学到的「年龄越小,输出为0的概率越高」的规律,将其判定为0类,这是机器学习模型泛化能力的正常表现。
2. 多区间分类的实现方法
你需要的是多分类任务,按照以下步骤实现即可:
第一步:给数据集打多分类标签
先根据年龄区间给原数据生成对应的输出标签,示例代码如下:
def get_label(age): if 0 <= age <=15: return 1 elif 16 <= age <=30: return 2 elif 31 <= age <=45: return 3 # 超过45的数值可以根据你的实际需求补充规则 data['Output'] = data['Age'].apply(get_label)
第二步:选择多分类模型训练
逻辑回归本身支持多分类任务,scikit-learn中的LogisticRegression默认就会处理多分类场景,也可以选择决策树、随机森林这类更擅长拟合区间规则的模型,示例训练代码:
from sklearn.tree import DecisionTreeClassifier # 特征和标签提取逻辑和之前的二分类任务一致 train_x = np.array(train[['Age']]) train_y = np.array(train["Output"]) # 初始化决策树分类器训练 clf = DecisionTreeClassifier() clf.fit(train_x, train_y) # 预测测试 print(clf.predict(np.array([[10]]))) # 输出1 print(clf.predict(np.array([[20]]))) # 输出2 print(clf.predict(np.array([[40]]))) # 输出3
如果你的区间规则是固定不变的,也可以直接用上述的get_label规则函数直接输出结果,不需要额外训练机器学习模型。
内容的提问来源于stack exchange,提问作者S Andrew
相关产品推荐
相关产品推荐

