赞
踩
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 用Seaborn画图
import seaborn as sns; sns.set()
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')
## 使用graphviz工具将.dot文件转为图片
## cmd
>>>dot -c
>>>dot -Tpng tree.dot -o tree.png
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.建立模型
from sklearn.datasets import load_iris
iris=load_iris()
from sklearn.linear_model import LogisticRegression
lr=LogisticRegression()
lr.fit(iris.data,iris.target)
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.自定义决策边界绘图函数
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()
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)
plot_estimator(lr3,X,y)
plot_estimator(svcm,X,y)
相对而言,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.数据准备
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)
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')
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))
'''
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()
2.准备数据
from sklearn.datasets import load_iris
iris=load_iris()
X=iris.data[:,0:2]
y=iris.target
3.随机森林模型
#随机森林
from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier(n_estimators=100,criterion='entropy',random_state=0)#n_estimators=1 1棵森林就是决策树 调整精确度
rfc.fit(X,y)
4.绘图
plot_estimator(rfc,X,y,'RandomForestClassifier')
#比较 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)
数据预处理
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 使用决策树模型
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
2使用逻辑回归
from sklearn.linear_model import LogisticRegression
lr=LogisticRegression()
lr.fit(X,y)
yfit2=lr.predict(X)
accuracy_score(y,yfit2)
>>>0.861986198619862
3使用支持向量机SVM
from sklearn.svm import SVC
svcm=SVC()
svcm.fit(X,y)
yfit3=svcm.predict(X)
accuracy_score(y,yfit3)
>>>1.0
但准确率不能完全代表模型的好坏
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。