公众号:尤而小屋 编辑:Peter 作者:Peter
大家好,我是Peter~
今天给大家介绍一个强大的机器学习建模扩展包:mlxtend。
mlxtend(machine learning extensions,机器学习扩展)是一个用于日常数据分析、机器学习建模的有用Python库。
mlxtend可以用作模型的可解释性,包括统计评估、数据模式、图像提取等。mlxtend是一个Python第三方库,用于支持机器学习和数据分析任务。
本文关键词:机器学习、mlxtend、聚类、分类、回归、模型可视化
MLxtend主要功能包含:
官方学习地址:https://rasbt.github.io/mlxtend/
In 1:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import itertools
from sklearn.linear_model import LogisticRegression # 逻辑回归分类
from sklearn.svm import SVC # SVC
from sklearn.ensemble import RandomForestClassifier # 随机森林分类
from mlxtend.classifier import EnsembleVoteClassifier # 从mlxtend导入集成投票表决分类算法
from mlxtend.data import iris_data # 内置数据集
from mlxtend.plotting import plot_decision_regions # 绘制决策边界
import warnings
warnings.filterwarnings('ignore')
提供一个分类模型相关的入门案例:
In 2:
X, y = iris_data()
X = X[:, [0,2]] # 所有行,选择2个列
X[:3]
Out2:
array([[5.1, 1.4],
[4.9, 1.4],
[4.7, 1.3]])
In 3:
y[:3]
Out3:
array([0, 0, 0])
In 4:
# 建立3个基线分类器
clf1 = LogisticRegression(random_state=0)
clf2 = RandomForestClassifier(random_state=0)
clf3 = SVC(random_state=0, probability=True) # 输出概率值
In 5:
eclf = EnsembleVoteClassifier(
clfs=[clf1,clf2,clf3], # 使用3个基分类器
weights=[2,1,1], # 赋予权重
voting="soft" # 使用软投票方式
)
绘制分类器的决策边界:
In 6:
list(itertools.product([0, 1],repeat=2)) # 计算笛卡尔积
Out6:
[(0, 0), (0, 1), (1, 0), (1, 1)]
In 7:
labels = ['Logistic Regression','Random Forest','RBF kernel SVM','Ensemble']
fig = plt.figure(figsize=(14, 10))
gs = gridspec.GridSpec(2, 2)
for clf, lab, grd in zip([clf1, clf2, clf3, eclf], # 分类器
labels, # 分类器名称
# 设置图片的位置:[0,0],[0,1],[1,0],[1,1]
itertools.product([0, 1],repeat=2)):
clf.fit(X,y)
ax = plt.subplot(gs[grd[0], grd[1]]) # 子图
fig = plot_decision_regions(X=X,
y=y,
clf=clf,
legend=2)
plt.title(lab) # 标题
plt.show()
MLxtend内置了线性回归的算法LinearRegression
https://rasbt.github.io/mlxtend/user_guide/regressor/LinearRegression/
LinearRegression类中有个参数method,取值不同:direct(默认)、qr(QR decomopisition)、svd(Singular Value Decomposition)、sgd(Stochastic Gradient Descent)
In 8:
import numpy as np
import matplotlib.pyplot as plt
from mlxtend.regressor import LinearRegression
# 模拟数据:从一维变成二维,使用np.newaxis函数
X = np.array([ 1.0, 2.1, 3.6, 4.2, 6])[:, np.newaxis]
y = np.array([ 1.0, 2.0, 3.0, 4.0, 5.0])
ne_lr = LinearRegression() # 默认方法
ne_lr.fit(X, y)
#print('Intercept: %.2f' % ne_lr.b_) # 截距
#print('Slope: %.2f' % ne_lr.w_[0]) # 斜率
def lin_regplot(X, y, model):
plt.scatter(X, y, c='blue')
plt.plot(X, model.predict(X), color='red')
return None
lin_regplot(X, y, ne_lr)
plt.show()
In 9:
import numpy as np
import matplotlib.pyplot as plt
from mlxtend.regressor import LinearRegression
X = np.array([ 1.0, 2.1, 3.6, 4.2, 6])[:, np.newaxis]
y = np.array([ 1.0, 2.0, 3.0, 4.0, 5.0])
ne_lr = LinearRegression(method="qr") #
ne_lr.fit(X, y)
def lin_regplot(X, y, model):
plt.scatter(X, y, c='blue')
plt.plot(X, model.predict(X), color='red')
return None
lin_regplot(X, y, ne_lr)
plt.show()
In 10:
import numpy as np
import matplotlib.pyplot as plt
from mlxtend.regressor import LinearRegression
X = np.array([ 1.0, 2.1, 3.6, 4.2, 6])[:, np.newaxis]
y = np.array([ 1.0, 2.0, 3.0, 4.0, 5.0])
gd_lr = LinearRegression(method='sgd',
eta=0.005,
epochs=100,
minibatches=1, # 必须和method="sgd"联用
random_seed=123,
print_progress=3)
gd_lr.fit(X, y)
def lin_regplot(X, y, model):
plt.scatter(X, y, c='blue')
plt.plot(X, model.predict(X), color='red')
return
lin_regplot(X, y, gd_lr)
plt.show()
绘制损失函数值cost随迭代次数epochs的变化情况:
In 11:
plt.plot(range(1, gd_lr.epochs+1), gd_lr.cost_)
plt.xlabel('Epochs')
plt.ylabel('Cost')
plt.ylim([0, 0.2])
plt.tight_layout()
plt.show()
mlxtend内置的是K-means算法
In 12:
import matplotlib.pyplot as plt
from mlxtend.data import three_blobs_data
X, y = three_blobs_data()
X[:3]
Out12:
array([[2.60509732, 1.22529553],
[0.5323772 , 3.31338909],
[0.802314 , 4.38196181]])
In 13:
y
Out13:
array([1, 2, 2, 2, 1, 2, 2, 1, 0, 2, 1, 0, 0, 2, 2, 0, 0, 1, 0, 1, 2, 1,
2, 2, 0, 1, 1, 2, 0, 1, 0, 0, 0, 0, 2, 1, 1, 1, 2, 2, 0, 0, 2, 1,
1, 1, 0, 2, 0, 2, 1, 2, 2, 1, 1, 0, 2, 1, 0, 2, 0, 0, 0, 0, 2, 0,
2, 1, 2, 2, 2, 1, 1, 2, 1, 2, 2, 0, 0, 2, 1, 1, 2, 2, 1, 1, 1, 0,
0, 1, 1, 2, 1, 2, 1, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 2, 2,
0, 2, 1, 0, 2, 0, 2, 2, 0, 0, 2, 1, 2, 2, 1, 1, 0, 1, 0, 0, 0, 0,
1, 0, 0, 0, 2, 0, 1, 0, 2, 2, 1, 1, 0, 0, 0, 0, 1, 1])
In 14:
plt.scatter(X[:, 0], X[:, 1], c='black')
plt.show()
In 15:
from mlxtend.cluster import Kmeans
km = Kmeans(k=3, # 聚类数
max_iter=50, # 最大迭代次数
random_seed=1, # 随机种子
print_progress=3 # 每隔3次打印进度
)
km.fit(X)
Iteration: 2/50 | Elapsed: 00:00:00 | ETA: 00:00:00
Out15:
<mlxtend.cluster.kmeans.Kmeans at 0x281b745ff10>
In 16:
km.iterations_ # 打印聚类的迭代次数
Out16:
2
In 17:
km.centroids_ # 打印聚类的中心
Out17:
array([[-1.5947298 , 2.92236966],
[ 2.06521743, 0.96137409],
[ 0.9329651 , 4.35420713]])
In 18:
# 聚类结果
y_clust = km.predict(X)
# 簇群1
plt.scatter(X[y_clust == 0, 0],
X[y_clust == 0, 1],
s=50,
c="lightgreen",
marker="s",
label="cluster1"
)
# 簇群2
plt.scatter(X[y_clust == 1, 0],
X[y_clust == 1, 1],
s=50,
c="orange",
marker="o",
label="cluster2"
)
# 簇群3
plt.scatter(X[y_clust == 2, 0],
X[y_clust == 2, 1],
s=50,
c="lightblue",
marker="v",
label="cluster3"
)
# 绘制聚类质心
plt.scatter(km.centroids_[:,0],
km.centroids_[:,1],
s=250,
marker='*',
c='red',
label='centroids')
plt.legend(loc='lower left',
scatterpoints=1
)
plt.grid()
plt.show()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。