当前位置:   article > 正文

【机器学习-样例】分类模型_def plot_estimator(estimator, x, y): x_min, x_max

def plot_estimator(estimator, x, y): x_min, x_max = x[:,0].min() - 1, x[:,0]

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 用Seaborn画图
import seaborn as sns; sns.set()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

一、决策树

1.建立模型

#准备数据
from sklearn.datasets import load_iris
iris=load_iris()

#建立模型
from sklearn import tree
clf=tree.DecisionTreeClassifier()#决策树分类\初始化模型
#clf=tree.DecisionTreeClassifier(max_depth=2)
clf.fit(iris.data,iris.target)#训练数据
'''
from sklearn.tree import  DecisionTreeClassifier
model=DecisionTreeClassifier()
model.fit(iris.data,iris.target()
'''

#输出模型,绘制成图
tree.export_graphviz(clf,out_file='tree.dot')#导出成graphviz格式

##使用graphviz工具将.dot文件转为图片

from IPython.display import Image
Image('tree.png')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
## 使用graphviz工具将.dot文件转为图片
## cmd
>>>dot -c
>>>dot -Tpng tree.dot -o tree.png
  • 1
  • 2
  • 3
  • 4

2.建立决策边界

#建立决策树边界
#只选择两个特征
X=iris.data[:,[2,3]]
y=iris.target
#plt.scatter(X[:,0],X[:,1])
#plt.xlabel('petal length')
#plt.ylabel('petal width')

clf2=tree.DecisionTreeClassifier(max_depth=2)
clf2.fit(X,y)

#建立坐标网格
x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
xx,yy=np.meshgrid(np.arange(x_min,x_max,0.1),np.arange(y_min,y_max,0.1))#网格

Z=clf2.predict(np.c_[xx.ravel(),yy.ravel()])#ravle()降成一维 np.c_按行连接两个矩阵
Z=Z.reshape(xx.shape)#重塑形

plt.figure()
plt.contourf(xx, yy, Z, alpha=0.4, cmap = plt.cm.RdYlBu)
plt.scatter(X[:, 0], X[:, 1], c=y,  cmap = plt.cm.brg)
plt.title('Decision Tree')
plt.xlabel('Petal.Length')
plt.ylabel('Petal.Width')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在这里插入图片描述

二、逻辑回归

从对连续因变量的预测转变为二元的结果(是/否)
用线型方程切割
1.建立模型

from sklearn.datasets import load_iris
iris=load_iris()
from sklearn.linear_model import LogisticRegression
lr=LogisticRegression()
lr.fit(iris.data,iris.target)
  • 1
  • 2
  • 3
  • 4
  • 5

2.建立决策边界

X=iris.data[:,[2,3]]
y=iris.target
#plt.scatter(X[:,0],X[:,1])
#plt.xlabel('petal length')
#plt.ylabel('petal width')


from sklearn.linear_model import LogisticRegression
lr2=LogisticRegression()
lr2.fit(X,y)


x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
xx,yy=np.meshgrid(np.arange(x_min,x_max,0.1),np.arange(y_min,y_max,0.1))#网格

Z=lr2.predict(np.c_[xx.ravel(),yy.ravel()])#ravle()降成一维 np.c_按行连接两个矩阵
Z=Z.reshape(xx.shape)

plt.figure()
plt.contourf(xx, yy, Z, alpha=0.4, cmap = plt.cm.RdYlBu)
plt.scatter(X[:, 0], X[:, 1], c=y,  cmap = plt.cm.brg)
plt.title('Logidtic Tree')
plt.xlabel('Petal.Length')
plt.ylabel('Petal.Width')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在这里插入图片描述

三、支持向量机SVM

1.自定义决策边界绘图函数

def plot_estimator(estimator,X,y):
    x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
    y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
    xx,yy=np.meshgrid(np.arange(x_min,x_max,0.1),np.arange(y_min,y_max,0.1))#网格

    Z=estimator.predict(np.c_[xx.ravel(),yy.ravel()])#ravle()降成一维 np.c_按行连接两个矩阵
    Z=Z.reshape(xx.shape)

    plt.figure()
    plt.contourf(xx, yy, Z, alpha=0.4, cmap = plt.cm.RdYlBu)
    plt.scatter(X[:, 0], X[:, 1], c=y,  cmap = plt.cm.brg)
    #plt.title('Logidtic Tree')
    plt.xlabel('Petal.Length')
    plt.ylabel('Petal.Width')
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.定义参数

X=iris.data[0:100,[2,3]]
y=iris.target[0:100]

from sklearn.linear_model import LogisticRegression
lr3=LogisticRegression()
lr3.fit(X,y)

#支持向量机
from sklearn.svm import SVC
svcm=SVC(kernel='linear')
svcm.fit(X,y)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
plot_estimator(lr3,X,y)
  • 1

在这里插入图片描述

plot_estimator(svcm,X,y)
  • 1

在这里插入图片描述
相对而言,svc模型考虑了最大边界的问题,准确率比较高
3.参数
a.参数C:正则项
C小,宽边界,一开始可能分类不准确
C大,窄边界,一开始分类比较准确,但数据量大后可能会过度拟合
在这里插入图片描述
b.kernel:是否线性
非线性处理数据量大的时候耗时长
rbf-非线性
poly-非线性
linear-线型

X=iris.data[:,[2,3]]
y=iris.target[:]


from sklearn.svm import SVC
svcr=SVC(kernel='rbf')
svcr.fit(X,y)
svcp=SVC(kernel='poly')
svcp.fit(X,y)
svcl=SVC(kernel='linear')
svcl.fit(X,y)


x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
xx,yy=np.meshgrid(np.arange(x_min,x_max,0.1),np.arange(y_min,y_max,0.1))#网格


#建立子图
f,axs=plt.subplots(1,3,sharex='col',sharey='row',figsize=(20,5))

for idx,svcm,title in zip([0,1,2],[svcr,svcp,svcl],['rbf','poly','linear']):
    Z=svcm.predict(np.c_[xx.ravel(),yy.ravel()])#ravle()降成一维 np.c_按行连接两个矩阵
    Z=Z.reshape(xx.shape)
    
    axs[idx].contourf(xx, yy, Z, alpha=0.4, cmap = plt.cm.RdYlBu)
    axs[idx].scatter(X[:, 0], X[:, 1], c=y,  cmap = plt.cm.brg)
    axs[idx].set_title(title)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

在这里插入图片描述

四、神经网络

1.数据准备

from sklearn.datasets import load_digits
digits=load_digits()
#标准化
from sklearn.preprocessing import StandardScaler#z标准化
scaler=StandardScaler()
scaler.fit(digits.data)
X_scaled=scaler.transform(digits.data)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.使用模型

#神经网路模型
from sklearn.neural_network import MLPClassifier
mlp=MLPClassifier(hidden_layer_sizes=(30,30,30),activation='logistic',max_iter=1000)
mlp.fit(X_scaled,digits.target)
#预测数据
predicted=mlp.predict(X_scaled)
#绘图
fig, axes = plt.subplots(6,6 , figsize=(8, 8),subplot_kw={'xticks':[], 'yticks':[]},gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i,ax in enumerate(axes.flat):
    ax.imshow(digits.images[i],cmap='binary',interpolation='nearest')
    ax.text(0.05,0.05,str(digits.target[i]),transform=ax.transAxes,color='green')
    ax.text(0.15,0.05,str(predicted[i]),transform=ax.transAxes,color='green' if digits.target[i]==predicted[i] else 'red')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

3.评价准确率

from sklearn.metrics import accuracy_score
accuracy_score(digits.target,predicted)
'''
res=[]
for i, j in zip(digits.target,predicted):
    res.append(i==j)
print(sum(res)/len(digits.target))
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

五、随机森林

sklearn.ensemble库,支持众多集成学习算法和模型。
Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法。即将弱分类器组装成强分类器的方法。
随机森林是决策树的延伸
1.自定义绘图函数

def plot_estimator(estimator,X,y,title):
    x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
    y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
    xx,yy=np.meshgrid(np.arange(x_min,x_max,0.1),np.arange(y_min,y_max,0.1))#网格

	#模型的预测值
    Z=estimator.predict(np.c_[xx.ravel(),yy.ravel()])#ravle()降成一维 np.c_按行连接两个矩阵
    Z=Z.reshape(xx.shape)

    plt.figure()
    plt.contourf(xx, yy, Z, alpha=0.4, cmap = plt.cm.RdYlBu)
    plt.scatter(X[:, 0], X[:, 1], c=y,  cmap = plt.cm.brg)
    plt.title(title)
    plt.xlabel('Sepal.Length')
    plt.ylabel('Sepal.Width')
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.准备数据

from sklearn.datasets import load_iris
iris=load_iris()

X=iris.data[:,0:2]
y=iris.target
  • 1
  • 2
  • 3
  • 4
  • 5

3.随机森林模型

#随机森林
from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier(n_estimators=100,criterion='entropy',random_state=0)#n_estimators=1 1棵森林就是决策树 调整精确度
rfc.fit(X,y)
  • 1
  • 2
  • 3
  • 4

4.绘图

plot_estimator(rfc,X,y,'RandomForestClassifier')
  • 1

在这里插入图片描述

六、比较

#比较
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeRegressor

X=iris.data[:,[0,1]]
y=iris.target

model1=SVC(kernel='rbf')
model1.fit(X,y)

model2=DecisionTreeRegressor()
model2.fit(X,y)

model3=RandomForestClassifier(n_estimators=10,criterion='entropy')
model3.fit(X,y)

model4=LogisticRegression()
model4.fit(X,y)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

七、案例-预测客户流失

数据预处理
import pandas as pd 
df= pd.read_csv('E:/Jupyter workspace/python_for_data_science/Data/customer_churn.csv', index_col=0, header = 0)

#剔除与流失无关的特征
df=df.iloc[:,3:]
#yes-no准换成1-0
collist=['international_plan','voice_mail_plan','churn']
for var in collist:
    df[var]=df[var].apply(lambda x: 1 if x=='yes' else 0)
X=df.iloc[:,:-1]
y=df.iloc[:,-1]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1 使用决策树模型

from sklearn import tree
dtc=tree.DecisionTreeClassifier(max_depth=3)#设置分层
dtc.fit(X,y)
#导出并查模型
tree.export_graphviz(dtc,"G:/scripts/tree.dot")
### --cmd输入命令转换 >dot -Tpng tree.dot -o tree.png
#转换后打印图片
from IPython.display import Image
Image("G:/scripts/tree.png")

#检验模型
yfit=dtc.predict(X)
from sklearn.metrics import accuracy_score
accuracy_score(y,yfit)
>>>0.9057905790579058
np.sum(y==yfit)/len(y)
>>>0.9057905790579058
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2使用逻辑回归

from sklearn.linear_model import LogisticRegression
lr=LogisticRegression()
lr.fit(X,y)
yfit2=lr.predict(X)
accuracy_score(y,yfit2)
>>>0.861986198619862
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3使用支持向量机SVM

from sklearn.svm import SVC
svcm=SVC()
svcm.fit(X,y)
yfit3=svcm.predict(X)
accuracy_score(y,yfit3)
>>>1.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

但准确率不能完全代表模型的好坏

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/293198
推荐阅读
相关标签
  

闽ICP备14008679号