1.逻辑回归的原理
逻辑回归的输入就是一个线性回归的结果。
sigmoid激活函数
判断标准
回归的结果输入到sigmoid函数当中
输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值
逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1.
逻辑回归的损失,称为对数似然损失,公式如下
综合完整损失函数
2.逻辑回归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:正则化力度
3示例-癌症分类
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score
# 在浏览器中访问该网站时会弹出证书不受信任,但是忽略仍可继续访问
# 但当使用Python登录时就会抛出_ssl.c:645错误,不能读取页面。
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
"""
癌症分类预测
数据描述
(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤
相关的医学特征,最后一列表示肿瘤类型的数值。
(2)包含16个缺失值,用”?”标出。
"""
# 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']
data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer"
"-wisconsin.data",
names=names)
data.head()
# 2.基本数据处理
# 2.1 缺失值处理
data = data.replace(to_replace="?", value=np.NaN) # 将缺失数据用nan代替
data = data.dropna() # 删除存在缺失的数据
# 2.2 确定特征值,目标值
x = data.iloc[:, 1:10]
x.head()
y = data["Class"]
y.head()
# 2.3 分割数据
x_train, x_test, y_train, y_test = train_test_split(x, y, 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)
print('预测值为:', y_predict)
score = estimator.score(x_test, y_test)
print('准确率:', score)
# 其他评估
"""
分类评估api
sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
y_true:真实目标值
y_pred:估计器预测目标值
labels:指定类别对应的数字
target_names:目标类别名称
return:每个类别精确率与召回率
"""
ret = classification_report(y_test, y_predict, labels=(2, 4), target_names=["良性", "恶性"])
print(ret)
# 不平衡二分类问题评估方法
"""
AUC计算API 随机取一对正负样本,正样本得分大于负样本的概率,最小值为0.5,最大值为1,取值越大越好
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 > 3, 1, 0)
print(roc_auc_score(y_true=y_test, y_score=y_predict))