使用Logistic Regression判断奇偶预测错误,求代码问题排查
逻辑回归判断数字奇偶预测错误排查
尝试用逻辑回归算法判断数字奇偶,以1-20的数组作为X_train,对应奇偶的0/1二进制数组作为y_train训练模型,但用X_test预测时得到错误结果,输出为[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]。原代码如下:
import numpy as np X_train = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], dtype=float).reshape(-1, 1) y_train = np.array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=float) X_test = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 55, 88, 99, 100], dtype=float).reshape(-1, 1) from sklearn import linear_model logreg = linear_model.LogisticRegression() logreg.fit(X_train, y_train) y_predict = logreg.predict(X_test) print(y_predict)
问题原因
逻辑回归是线性分类模型,只能学习特征与标签之间的线性关系。但数字的奇偶性和数值大小并非线性关系:奇数和偶数随数值增大交替出现,不存在一个线性阈值能将两类完全分开。模型训练时只能拟合出“数值较小的样本更可能是1,数值较大的样本更可能是0”的错误规律,导致预测结果完全偏离预期。
解决方案
通过特征工程提取能直接反映奇偶性的特征——对数字取模2,此时特征值与标签完全线性相关(模2得1对应奇数,模2得0对应偶数),逻辑回归就能正确学习分类规则。
修改后的代码:
import numpy as np # 特征工程:用数字对2取模作为输入特征 X_train = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]).reshape(-1, 1) % 2 y_train = np.array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]) X_test = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 55, 88, 99, 100]).reshape(-1, 1) % 2 from sklearn.linear_model import LogisticRegression logreg = LogisticRegression() logreg.fit(X_train, y_train) y_predict = logreg.predict(X_test) print(y_predict)
运行后输出:[1 0 1 0 1 0 1 0 1 0 1 0 1 0],完全符合预期。
内容的提问来源于stack exchange,提问作者rsa9
相关产品推荐
相关产品推荐

