Логистическая регрессия, также известная как логистическая регрессия. Хотя в названии есть «регрессия», на самом деле это метод классификации, и он в основном решает проблему двух классов.Конечно, он также может решать проблему нескольких классов, но два класса более распространены.
Сценарии применения:
- CTR объявления
- Это спам
- болен или нет
- финансовое мошенничество
- поддельный аккаунт
принцип
Логистическая функция, также известная как сигмовидная функция, используется в логистической регрессии. Сигмовидная функция является одной из функций, часто используемых в глубоком обучении, Формула функции:
Ниже показан график функции, похожий на сигмовидный:
В sklearn мы используем функцию LogisticRegression() для построения классификатора логистической регрессии, В функции есть некоторые общие параметры построения:
штраф: пункт штрафа, значение l1 или l2, по умолчанию l2. Когда параметры модели удовлетворяют распределению Гаусса, используйте l2, а когда параметры модели удовлетворяют распределению Лапласа, используйте l1;
решатель: представляет метод оптимизации функции потерь логистической регрессии. Есть 5 необязательных параметров: liblinear, lbfgs, newton-cg, sag и saga. По умолчанию используется liblinear, который подходит для наборов данных с небольшим объемом данных.Когда объем данных большой, можно использовать метод провисания или саги. max_iter: максимальное количество итераций для сходимости алгоритма, по умолчанию 10. n_jobs: количество ядер ЦП при подгонке и прогнозировании. Значение по умолчанию равно 1 или может быть целым числом. Если это -1, это представляет количество ядер ЦП.
Метрики оценки модели
Например, для суждения о террористах в службе безопасности аэропорта показатель точности нельзя использовать для оценки модели. Доля террористов чрезвычайно низка, поэтому при использовании показателя точности для вынесения суждений, если показатель точности достигает 99,999%, означает ли это, что эта модель должна быть хорошей?
На самом деле, поскольку доля террористов в реальной жизни чрезвычайно мала, даже если террориста невозможно идентифицировать, будет получен очень высокий уровень точности. Потому что критерием точности является соотношение между количеством правильно классифицированных выборок и общим количеством выборок. Поэтому доля нетеррористов будет очень высока.Даже если террористы не могут быть идентифицированы, доля правильно классифицированных образцов будет очень высока, то есть показатель точности будет высок. На самом деле следует больше внимания уделять выявлению террористов.
Четыре случая предсказания данных: TP, FP, TN, FN. Вторая буква P или N обозначает, является ли прогноз положительным или отрицательным, где P является положительным, а N отрицательным. Первая буква T или F показывает, является ли предсказание правильным, T правильным и F неправильным. ‘
Таким образом, четыре случая:
- ТП: Предсказание положительное и суждение верное;
- ФП: Предсказание положительное, а суждение ошибочное;
- ТН: предсказание отрицательное и суждение верное;
- ФН: Прогноз отрицательный, а суждение неверное.
Коэффициент точности P = TP/(TP+FP), соответствующий вышеприведенному примеру с террористами, среди всех людей, признанных террористами, — доля настоящих террористов.
Напомним, R = TP / (TP + FN), также известный как отзыв. Он представляет собой отношение количества правильно идентифицированных террористов к общему количеству террористов.
Существует метрика, которая сочетает в себе точность и полноту, чтобы лучше оценить качество модели. Этот показатель называется F1 и выражается следующим образом:
F1 используется как среднее гармоническое точности P и полноты R. Чем больше значение, тем лучше результат модели.
пример
Анализ мошенничества с кредитными картами
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, precision_recall_curve
import itertools
class CreditFraud:
# 混淆矩阵可视化
def plot_confusion_matrix(self, cm, classes, normalize=False, title='Confusion matrix', cmap=plt.cm.Blues):
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure()
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=0)
plt.yticks(tick_marks, classes)
thresh = cm.max() / 2
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, cm[i, j],
horizontalalignment='center',
color='white' if cm[i, j] > thresh else 'black')
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()
# 显示模型评估结果
def show_metrics(self, cm):
tp = cm[1, 1]
fn = cm[1, 0]
fp = cm[0, 1]
tn = cm[0, 0]
print('精确率:{:.3f}'.format(tp / (tp + fp)))
print('召回率:{:.3f}'.format(tp / (tp + fn)))
print('f1值:{:.3f}'.format(2 * (((tp / (tp + fp)) * (tp / (tp + fn))) / ((tp / (tp + fp)) + (tp / (tp + fn))))))
# 绘制精确率-召回率曲线
def plot_precision_recall(self, recall, precision):
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.step(recall, precision, color='b', alpha=0.2, where='post')
plt.fill_between(recall, precision, step='post', alpha=0.2, color='b')
plt.plot(recall, precision, linewidth=2)
plt.xlim([0.0, 1])
plt.ylim([0.0, 1.05])
plt.xlabel('召回率')
plt.ylabel('精确率')
plt.title('精确率-召回率 曲线')
plt.show()
# 显示交易笔数,欺诈交易笔数
def show(self, data):
# 设置plt正确显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 绘制类别分布
plt.figure()
ax = sns.countplot(x='Class', data=data)
plt.title('类别分布')
plt.show()
num = len(data)
num_fraud = len(data[data['Class'] == 1])
print('总交易笔数:', num)
print('诈骗交易笔数:', num_fraud)
print('诈骗交易比例:{:.6f}'.format(num_fraud / num))
# 诈骗和正常交易可视化
f, (ax1, ax2) = plt.subplots(2, 1, sharex='True', figsize=(10, 8))
bins = 50
ax1.hist(data.Time[data.Class == 1], bins=bins, color='deeppink')
ax1.set_title('诈骗交易')
ax2.hist(data.Time[data.Class == 0], bins=bins, color='deepskyblue')
ax2.set_title('正常交易')
plt.xlabel('时间')
plt.ylabel('交易次数')
plt.show()
def logic_regress(self, data):
self.show(data)
# 对Amount进行标准化
data['Amount_Norm'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1, 1))
# 特征选择
y = np.array(data.Class.tolist())
# y = data.Class.values
data_new = data.drop(['Time', 'Amount', 'Class'], axis=1)
X = np.array(data_new.values)
trian_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.1, stratify=y, random_state=33)
# 逻辑回归分类
clf = LogisticRegression(n_jobs=-1)
clf.fit(trian_x, train_y)
predict_y = clf.predict(test_x)
# 预测样本的置信分数
score_y = clf.decision_function(test_x)
# 计算混淆矩阵
cm = confusion_matrix(test_y, predict_y)
class_names = [0, 1]
# 显示混淆矩阵
self.plot_confusion_matrix(cm, classes=class_names, title='逻辑回归 混淆矩阵')
# 显示模型评估分数
self.show_metrics(cm)
# 计算精确率、召回率、阈值用于可视化
precision, recall, thresholds = precision_recall_curve(test_y, score_y)
self.plot_precision_recall(recall, precision)
if __name__ == '__main__':
data_ori = pd.read_csv(r'C:\My_data\Study\数据分析实战\credit_fraud\creditcard.csv')
print(data_ori.describe())
credit = CreditFraud()
credit.logic_regress(data_ori)
В последнее время многие друзья консультировались по поводу изучения Python через личные сообщения. Для облегчения общения нажмите на синий, чтобы присоединиться к себеРесурсная база обсуждений и ответов