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