首页 > 编程知识 正文

有趣有深度的问题,看问题的深度和广度

时间:2023-05-06 03:40:17 阅读:239641 作者:607

二元分类问题

欢迎转载,转载请注明来源
二元分类(binary classification),是机器学习里比较早就应用的学习模型,比较著名的应用就是垃圾邮件分类识别。 二元分类一般分为正例(positive)和反例(negative)。其他还有医疗诊断和信用卡欺诈识别。分出垃圾邮件和特殊疾病的类都是正例类别(positive class)。一个简单的分类方法就是训练集上,做出一个特征树,把每个特征树的叶子上各个类别的数量标出来,选择大多数的类别,作为这个叶子的类别。这样特征树就变成了决策树。

如上图一所示,找出一批邮件,作为训练集,垃圾邮件有20封 出现保险字样,正常邮件有5封出现保险字样,在没有保险字样的邮件里,出现彩票字样的垃圾邮件有10封,正常邮件有5封。没有出现保险和彩票字样的邮件,垃圾邮件有20封,正常邮件有40封。所以每个叶子节点,取大多数类别的值 画圈所示,就得到了一棵决策树。也可以用其他方法得到各种情况的概率大小,取概率的的类别作为最后的类别。这样,我们就可以用这个决策树去判断测试集,得到测试集的数据分类。比如我们拿一些未知的邮件,这些邮件就是测试集,去按照这个决策树的条件去判断每一封测试集的邮件,最后得出每个邮件是不是垃圾邮件。
核心代码

model = Sequential()model.add(Dense(64, activation='relu', input_dim=20))model.add(Dropout(0.5))model.add(Dense(64, activation='relu'))model.add(Dropout(0.3))model.add(Dense(10, activation='softmax'))model.compile(optimizer=SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True), loss='categorical_crossentropy', metrics=['accuracy'])

完整代码撮这里

核心代码

model = Sequential()model.add(Dense(10, input_dim=4, activation='tanh'))model.add(Dropout(0.5))model.add(Dense(3, activation='softmax'))model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])

完整代码撮这里
二元分类模型不止是决策树,还有线性模型等等,都可以把现有数据分成两类。

了解了二元分类的过程,我们可以扩展到多元分类(multi-class classification),顾名思义就是分类不止是两类,而是多类。如果你有一个二元分类模型,比如线性模型,有很多方法可以把他们变成K 类分类器。一对多模式(one-versus-rest) ,训练K 个二元分类器,第一份分类器,把类一 C1 从其他类里分出来,第二个分类器把类二 C2 从其他类里分出来,如此继续。当我们训练第i 类时,我们把第i类 Ci的所有实例,当作正例,其他类都是反例。比方说,分第一类时,只把第一类作为正例,其他作为反例,找到第一类。还有一对一模式(one-versus-one), 在这种模式下,训练k(k-1)/2个二元分类器,每对不同的类只训练一次。

逻辑函数

logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。
核心代码

def get_random_data(train=True): if train: data_number_size = data_number else: data_number_size = int(data_number / 2) X = np.random.random_integers(low=0, high=data_number_size, size=(data_number_size, class_number)) # print(X) y = np.random.randint(low=0, high=class_number, size=(data_number_size,)) # print(y) print(np.c_[X, y][0]) data1 = pd.DataFrame(np.c_[X, y]) if train: data1.to_csv('output/train_random_csv.csv', sep=',', header=False, index=False) data1.to_json('output/train_random_json.json') data1.to_html('output/train_random_html.html') else: data1.to_csv('output/test_random_csv.csv', sep=',', header=False, index=False)def train_data(): lr = linear_model.LogisticRegression() X_train = pd.read_csv("output/test_random_csv.csv").values[:, 0: class_number] y_train = pd.read_csv("output/test_random_csv.csv").values[:, class_number] lr.fit(X=X_train, y=y_train) model = lr return modeldef test_predict(model): get_random_data(False) X_test = pd.read_csv("output/test_random_csv.csv").values[:, 0:class_number] y_test = pd.read_csv("output/test_random_csv.csv").values[:, class_number] label = model.predict(X=X_test) prob = model.predict_proba(X_test) print(prob, 'n', label)

完整代码挫这里

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。