逻辑回归
逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归。由于算法的简单和高效,在实际中应用非常广泛。逻辑回归是解决二分类问题的利器。
逻辑回归的输入就是一个线性回归的结果。
sigmoid函数
回归的结果输入到sigmoid函数当中
输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值
API
sklearn.linear_model.LogisticRegression(solver=‘liblinear’, penalty=‘l2’, C = 1.0)
solver可选参数:{‘liblinear’, ‘sag’, ‘saga’,‘newton-cg’, ‘lbfgs’},
默认: ‘liblinear’;用于优化问题的算法。
对于小数据集来说,“liblinear”是个不错的选择,而“sag”和’saga’对于大型数据集会更快。对于多类问题,只有’newton-cg’, ‘sag’,
'saga’和’lbfgs’可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。penalty:正则化的种类
C:正则化力度
案例:癌症分类预测-良/恶性乳腺癌肿瘤预测
数据集连接:https://archive.ics.uci.edu/ml/machine-learning-databases/
from sklearn.datasets import load_boston #数据引入
from sklearn.model_selection import train_test_split #数据分割
from sklearn.preprocessing import StandardScaler #标准化
from sklearn.linear_model import LogisticRegression #逻辑回归
from sklearn.externals import joblib #模型保存加载
import pandas as pd
import numpy as np
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# 1.获取数据
# 1.1 设置标签
names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
'Normal Nucleoli', 'Mitoses', 'Class']
# 1.2 读取数据
data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
names=names)
# 2.数据集划分
# 2.1 处理缺失值
data = data.replace(to_replace= "?" ,value= np.NaN)
data = data.dropna()
# 2.2 设置特征值与目标值
c_data = data.iloc[ : ,1:10] #数据划分,先行后列
c_target = data["Class"]
# 2.3 数据划分
x_train, x_test, y_train, y_test = train_test_split(c_data , c_target , random_state=22)
# 3.特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4.机器学习-逻辑回归
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
# 5.模型评估
y_predict = estimator.predict(x_test)
estimator.score(x_test, y_test)
结果:
0.9766081871345029
分类评估方法
在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
常用评价指标:
准确率:(对不对) (TP+TN)/(TP+TN+FN+FP)
精确率 – 查的准不准 TP/(TP+FP)
召回率 – 查的全不全TP/(TP+FN)
F1-score 反映模型的稳健性roc曲线和auc指标
roc曲线: 通过TPR和FPR来进行图形绘制,然后绘制之后,行成一个指标 auc
auc: ROC曲线下的面积,越接近1,效果越好
越接近0,效果越差 越接近0.5,效果就是胡说
ROC曲线的绘制
API
AUC计算API
from sklearn.metrics import roc_auc_score sklearn.metrics.roc_auc_score(y_true, y_score) 计算ROC曲线面积,即AUC值
y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
y_score:预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值
y_test = np.where(y_test > 2.5, 1, 0) #分类1,0
print("AUC指标:", roc_auc_score(y_test, y_predict))
结果:
AUC指标: 0.9743243243243243
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc ###计算roc和auc
from sklearn import model_selection
# Import some data to play with
c_target = data["Class"].replace(to_replace= 2 ,value= 0)
c_target = c_target.replace(to_replace= 4 ,value= 1)
X = np.array(c_data)
y = np.array(c_target)
# Add noisy features to make the problem harder添加扰动
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
# shuffle and split training and test sets划分样本集
train_data, test_data, train_label, test_label = model_selection.train_test_split(X, y, test_size=.3,random_state=0)
#train_data用于训练的样本集, test_data用于测试的样本集, train_label训练样本对应的标签集, test_label测试样本对应的标签集
# Learn to predict each class against the other分类器设置
svm = svm.SVC(kernel='linear', probability=True,random_state=random_state)#使用核函数为线性核,参数默认,创建分类器
###通过decision_function()计算得到的test_predict_label的值,用在roc_curve()函数中
test_predict_label = svm.fit(train_data, train_label).decision_function(test_data)
#首先通过fit来对训练样本和训练样本标签进行训练得到模型,然后通过decision_function来获得模型对于测试样本集预测的标签集
print(test_predict_label)
# Compute ROC curve and ROC area for each class#计算tp,fp
#通过测试样本输入的标签集和模型预测的标签集进行比对,得到fp,tp,不同的fp,tp是算法通过一定的规则改变阈值获得的
fpr,tpr,threshold = roc_curve(test_label, test_predict_label) ###计算真正率和假正率
print(fpr)
print(tpr)
print(threshold)
roc_auc = auc(fpr,tpr) ###计算auc的值,auc就是曲线包围的面积,越大越好
plt.figure()
lw = 2
plt.figure(figsize=(10,10))
plt.plot(fpr, tpr, color='darkorange',
lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假正率为横坐标,真正率为纵坐标做曲线
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
结果: