笔记,主要记录阿里云天池龙珠训练营机器学习部分的学习成果
逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个字,但逻辑回归其实是一个分类模型,主要用于两分类问题(即输出只有两种,分别代表两个类别)。
回归模型中,y是一个定性变量,比如y=0或1,logistic方法主要应用于研究某些事件发生的概率。
优点:
● 速度快,适合二分类问题
● 简单易于理解,直接看到各个特征的权重
● 能容易地更新模型吸收新的数据
缺点:
● 对数据和场景的适应能力有局限性,不如决策树算法适应性那么强
● 容易欠拟合,分类精度可能不高
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression
#这里导入了构建矩阵的numpy库、作图的plot和seaborn库、以及sklearn中线性模型的lr(逻辑回归)库
data = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
label = np.array([0, 0, 0, 1, 1, 1])
#这里构成了data(对应二维坐标上的六个点),label(表示data六个点对应的标签)
#可以看到共有0和1两种类型
lr = LogisticRegression()
lr = lr.fit(data, label)
#这里调用lr函数,并使用fit对data和label进行拟合
#其拟合方程为 y=w0+w1*x1+w2*x2
# 查看其对应模型的w
print('the weight of Logistic Regression:',lr_clf.coef_)
# 查看其对应模型的w0
print('the intercept(w0) of Logistic Regression:',lr_clf.intercept_)
# 可视化构造的数据样本点
plt.figure()
plt.scatter(data[:,0], data[:,1], c = label)#横轴为data矩阵0位元素,纵轴为1位元素,颜色根据label来分类
plt.title('Dataset')
plt.show()
#如下图,六个点分成了黑黄两类
# 可视化决策边界
plt.figure()
plt.scatter(data[:,0], data[:,1], c = label)
plt.title('Dataset')
nx, ny = 200, 100
x_min, x_max = plt.xlim()
y_min, y_max = plt.ylim()
x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx),np.linspace(y_min, y_max, ny))
z_proba = lr.predict_proba(np.c_[x_grid.ravel(), y_grid.ravel()])
z_proba = z_proba[:, 1].reshape(x_grid.shape)
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')
plt.show()
#这里从横轴和纵轴的界限,构建等差矩阵x_grid和y_grid,使用拟合好的lr模型预测概率,并将所得概率为0.5(即分界点)的所有点画成线,成功将两类型的分界线画出
#现在我们新建两个点
new_data1 = np.array([[0, -1]])
new_data2 = np.array([[1, 2]])
#通过lr模型预测new1和new2的分类情况
new1_pre = lr.predict(new_data1)
new2_pre = lr.predict(new_data2)
#可以看到两个点分别属于0和1
#通过lr模型预测两个点的分布概率
new1_pro = lr.predict_proba(new_data1)
new2_pro = lr.predict_proba(new_data2)
#可以看到proba给出的是两种类型的所属概率,对于new1,属于0类的概率为0.695,属于1类的概率为0.304,new2同理
#依旧是导入使用的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#不同的是,此次的数据来自sklearn自带的iris数据集
from sklearn.datasets import load_iris
data = load_iris()
iris_target = data.target #得到数据对应的标签
iris_data = pd.DataFrame(data = data.data, columns = data.feature_names)
iris_data.head(5)
#查看数据集前五行,每一行代表一个花的所有属性,对应有sl、sw、pl、pw四个属性的值
pd.Series(iris_target).value_counts()
#查看iris种类的分布情况,共有0、1、2三类,每类占50
## 合并标签和特征信息
iris_all = iris_data.copy() ##进行浅拷贝,防止对于原始数据的修改
iris_all['target'] = iris_target
## 特征与标签组合的散点可视化
sns.pairplot(data = iris_all, diag_kind='hist', hue= 'target')
plt.show()
#绘制直方图,横纵轴都是四个label,类别为target的三种,生成4*4矩阵图
# 选取其前三个特征绘制三维散点图
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')#3d图
iris_all_class0 = iris_all[iris_all['target']==0].values
iris_all_class1 = iris_all[iris_all['target']==1].values
iris_all_class2 = iris_all[iris_all['target']==2].values
# 'setosa'(0), 'versicolor'(1), 'virginica'(2)
ax.scatter(iris_all_class0[:,0], iris_all_class0[:,1], iris_all_class0[:,2],label='setosa')#三坐标分别是values的0、1、2位元素
ax.scatter(iris_all_class1[:,0], iris_all_class1[:,1], iris_all_class1[:,2],label='versicolor')
ax.scatter(iris_all_class2[:,0], iris_all_class2[:,1], iris_all_class2[:,2],label='virginica')
plt.legend()
plt.show()
#提取data和target的前两部分(label为0、1),4:1划分训练集和测试集
from sklearn.model_selection import train_test_split
X = iris_data.iloc[:100]
y = iris_target[:100]
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 2021)
#调用模型设置参数进行训练
lr = LogisticRegression(random_state=0, solver='lbfgs')
lr.fit(x_train, y_train)
#训练好后在train集合test集进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
from sklearn import metrics
#带哦用metrics库的acc,进行真实值与预测值的正确率检测
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
#训练集回测结果和测试集测试结果都极为准确
#下面进行所有数据的三分类预测
x_train, x_test, y_train, y_test = train_test_split(iris_data, iris_target, test_size = 0.2, random_state = 2021)
clf = LogisticRegression(random_state=0, solver='lbfgs')
clf.fit(x_train, y_train)
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
# 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
#回测正确率0.98,测试集正确率0.86