机器学习平凡之路四

机器学习平凡之路四

  1. 分类
  2. 逻辑回归

分类

事物的类别比如,根据客户的收入,存款,性别等为客户的信用等级分类

读入图片,为图片内容分类

分类的过程就是确定某一事物隶属于某一个类别的可能性大小的过程

通过Sigmoid函数 g(z) = 1/1+e的-z次方

逻辑回归做的事情就是把线性回归输出的任意值,通过数学上的转换,输出0-1的结果

逻辑回归解决二元分类的问题

数据的准备与分析

1
2
3
4
import numpy as np
import pandas as pd
df_heart = pd.read_csv('heart.csv')
df_heart.head()

image-20210325101537753

1
df_heart.target.value_counts() # 查看心脏病的分类数统计

image-20210325101644579

1
2
3
4
5
6
7
8
9
10
11
12
# 显示年龄与最大心率两个特性与是否患病之间的关系
import matplotlib.pyplot as plt
plt.scatter(x=df_heart.age[df_heart.target==1],
y=df_heart.thalach[df_heart.target==1], c='red'
)
plt.scatter(x=df_heart.age[df_heart.target==0],
y=df_heart.thalach[df_heart.target==0], marker='^'
)
plt.legend(['Disease','No Disease'])
plt.xlabel('age')
plt.ylabel('heart rate')
plt.show()

image-20210325102456635

构建特征和标签集,数据特征缩放

1
2
3
4
5
X = df_heart.drop(['target'], axis = 1) # 构建特征集
y = df_heart.target.values # 构建标签集
y = y.reshape(len(y),1)
print(X.shape)
print(y.shape)

image-20210325103027802

1
2
3
4
5
6
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train) # 先拟合在应用
X_test =scaler.transform(X_test) # 直接应用

建立逻辑回归模型

逻辑函数的定义

1
2
def sigmoid(z):
y_hat = 1/(1+np.exp(-z))

使用线性回归模型

1
2
3
4
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression() # 代表使用逻辑回归模型
lr.fit(X_train,y_train) # 相当于梯度下降
print(lr.score(X_test,y_test)*100)

image-20210325112352571

关于哑特征

注意观察cp和thal和slope。它们的取值都在0-4,但是计算会认为这个可以比较的数值。所以要做一定的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
a = pd.get_dummies(df_heart['cp'], prefix ='cp')
b = pd.get_dummies(df_heart['thal'], prefix ='thal')
c = pd.get_dummies(df_heart['slope'], prefix ='slope')
frames = [df_heart,a,b,c]
df_heart = pd.concat(frames, axis = 1)
df_heart = df_heart.drop(columns = ['cp','thal','slope'])
X = df_heart.drop(['target'], axis = 1) # 构建特征集
y = df_heart.target.values # 构建标签集
y = y.reshape(len(y),1)
print(X.shape)
print(y.shape)
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train) # 先拟合在应用
X_test =scaler.transform(X_test) # 直接应用
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression() # 代表使用逻辑回归模型
lr.fit(X_train,y_train) # 相当于梯度下降
print(lr.score(X_test,y_test)*100)

image-20210325113823867

多元分类

多元分类本质就是训练好多个二元分类器之后,做预测的时候将所有二元分类器都运行一遍。对每一个输入样本,选择最高可能性的输出概率

多元分类的损失函数

多元分类的标签有以下两种格式

  1. 一种是通过one-hot格式编码分类
  2. 一种是直接转换为类别数字
  3. 如果通过one-hot 则应该使用分类交叉熵
  4. 如果通过标签编码,则应该使用稀疏分类交叉熵

正则化和欠拟合,过拟合

标准化,规范化,归一化,是调整数据

正则化是调整模型,和约束权重

过拟合现象是机器学习无法回避的。降低拟合一般增加数据集的个数,找到模型优化试的平衡点,添加正则化

正则的本质是崇尚简单化,以最小化损失和复杂度为目标

  1. L1正则化,根据权重的绝对值综合来惩罚权重,有助于不相关或者几乎不相关的特征的权重正好为0,从而将这些特征从模型中移除
  2. L2正则化,根据权重的平方和惩罚权重,线性模型中,能够增强泛化的目的
  3. L1是套索回归,L2是岭回归

实际案例

数据准备和分析

1
2
3
4
5
6
7
import numpy as np
import pandas as pd
from sklearn import datasets
iris = datasets.load_iris()
X_sepal = iris.data[:,[0,1]]
X_petal = iris.data[:,[2,3]]
y = iris.target

分割数据集

1
2
3
4
5
6
7
8
9
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X_train_sepal, X_test_sepal, y_train_sepal, y_test_sepal = \
train_test_split(X_sepal,y,test_size=0.3,random_state=0)
print(len(X_train_sepal))
print(len(X_test_sepal))
scaler = StandardScaler()
X_train_sepal = scaler.fit_transform(X_train_sepal)
X_test_sepal = scaler.transform(X_test_sepal)

使用逻辑回归

1
2
3
4
5
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(penalty='l2', C = 10) # 这里的C可以以后自动调整
lr.fit(X_train_sepal, y_train_sepal)
score = lr.score( X_test_sepal,y_test_sepal)
print(score)

image-20210325140748429

自动调整参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import warnings
warnings.filterwarnings( "ignore")
from sklearn.model_selection import GridSearchCV
params = { 'C':[ 0.0001, 1, 100, 1000],

'max_iter':[ 1, 10, 100, 500],

'class_weight':[ 'balanced', None],

'solver':[ 'liblinear', 'sag', 'lbfgs', 'newton-cg']

}

lr = LogisticRegression()
clf = GridSearchCV(lr, param_grid=params, cv= 10)
clf.fit(X_train_sepal,y_train_sepal)
clf.best_params_

image-20210325142057021

1
2
3
4
classifier = LogisticRegression(**clf.best_params_)
classifier.fit(X_train_sepal, y_train_sepal)
score = classifier.score( X_test_sepal,y_test_sepal)
print(score)

image-20210325142125391