机器学习之逻辑回归和感知机
·
一、逻辑回归
逻辑回归(Logistic Regression)是一种用于解决分类问题的统计方法,尤其适用于二分
类问题。尽管名称中有“回归”,但它主要用于分类任务。


1、损失函数
对数损失Log Loss,又叫二元交叉熵损失(Binary Cross-Entropy Loss BCE),用于衡量模型输出的概率分布与真实标签之间的差距。




2、案例——心脏病预测
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler,OneHotEncoder
from sklearn.linear_model import LogisticRegression
dataset = pd.read_csv('E:\\Py_project\\numpy_pandas\\heart_disease\\data\\heart_disease.csv')
dataset.dropna(inplace=True)
x = dataset.drop('是否患有心脏病',axis=1)
y = dataset['是否患有心脏病']
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3,random_state=42)
numerical_features = ["年龄", "静息血压", "胆固醇", "最大心率", "运动后的ST下降", "主血管数量"]
categorical_features = ["胸痛类型", "静息心电图结果", "峰值ST段的斜率", "地中海贫血"]
binary_features = ["性别", "空腹血糖", "运动性心绞痛"]
column_transformer = ColumnTransformer(transformers=[
("num",StandardScaler(),numerical_features),
('cat',OneHotEncoder(drop = 'first'),categorical_features),
('bin','passthrough',binary_features)
])
x_train = column_transformer.fit_transform(x_train)
x_test = column_transformer.transform(x_test)
model = LogisticRegression(
solver='saga',
max_iter=1000,
penalty='l1',
C=0.5,
class_weight='balanced',
random_state=42,
)
model.fit(x_train,y_train)
score = model.score(x_test,y_test)
print(score)
0.8181818181818182
3、多分类任务
一对多OVR(One-vs-Rest)和Softmax回归(Multinomial Logistic Regression,多项逻辑回归)
OVR是当作K个二分类器模型,概率之和不一定就等于1,比较适合类别比较少的情况
Softmax是一个函数,取代之前的sigmoid二分函数,当作一个多分类模型,概率之和等于1
以下是OVR模型创建代码,因为版本问题推荐用model_ovr2的方式创建
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
model_ovr1 = LogisticRegression(multi_class="ovr")
model_ovr2 = OneVsRestClassifier(LogisticRegression())
以下是多项逻辑回归Softmax,softmax2是最新版本,默认用multinomial,现在只要是分类任务大于等于3个的时候,就是默认multinomial,不用传参数了,2分类就是用之前的逻辑回归,一般不用OVR,如果实在想用,看上面的代码。
from sklearn.linear_model import LogisticRegression
model_softmax = LogisticRegression(multi_class='multinomial')
model_softmax2 = LogisticRegression()
4、案例——手写数字识别
imshow是一种把数字转换成颜色的画图翻译器
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import MinMaxScaler
dataset = pd.read_csv('E:\\Py_project\\numpy_pandas\\day01\\data\\train.csv')
X = dataset.drop(columns=['label'],axis=1)
y = dataset['label']
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
digit = x_train.iloc[3,:].values.reshape(28,28)
label = y_train.iloc[3]
print(label)
plt.imshow(digit,cmap = 'gray')
plt.show()
scalar = MinMaxScaler()
x_train = scalar.fit_transform(x_train)
x_test = scalar.transform(x_test)
model = LogisticRegression(
max_iter=500,
)
model.fit(x_train,y_train)
score = model.score(x_test,y_test)
print(score)
9
0.9186507936507936

二、感知机perceptron

1、逻辑门代码实现
与门为例
import numpy as np
def AND0(x1,x2):
w1,w2,theta = 0.5,0.5,0.7
result = w1 * x1 + w2 * x2
if result <= theta:
return 0
else:
return 1
def AND1(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7
result = w @ x + b
if result <= 0:
return 0
else:
return 1
2、感知机的局限
异或门

3、多层感知机实现异或门
组合构成异或门


代码实现的话就是调用三个函数,传入对应结果
更多推荐
所有评论(0)