python机器学习
1、使用训练/测试法防止多项式回归中的过拟合
2、K均值聚类–基于收入与年龄进行人群聚类
3、决策树–使用Python预测录用决策
4、支持向量机–通过SVM进行人员聚类
# 使用训练/测试法防止多项式回归中的过拟合
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
np.random.seed(2)
# 先创建数据集
pagespeeds=np.random.normal(3,1,100)
purchaseamout=np.random.normal(50,30,100)/pagespeeds
plt.scatter(pagespeeds,purchaseamout,edgecolor='black')
# 将数据80%作为训练集,20%作为测试集
train_x=pagespeeds[:80]
test_x=pagespeeds[80:]
train_y=purchaseamout[:80]
test_y=purchaseamout[80:]
plt.scatter(train_x,train_y,edgecolor='black') # 基本与原来数据集有相同的形状,说明能够代表原来的数据
plt.scatter(test_x,test_y,edgecolor='black') # 其余20%数据也大致有相同的形状
x=np.array(train_x)
y=np.array(train_y)
p8=np.poly1d(np.polyfit(x,y,8))
xp=np.linspace(0,7,100)
axes=plt.axes()
axes.set_xlim([0,7])
axes.set_ylim([0,200])
plt.scatter(x,y,edgecolor='black')
plt.plot(xp,p8(xp),c='g')
# 从结果看出现了过拟合
# 接下来看看在测试集的效果
testx=np.array(test_x)
testy=np.array(test_y)
axes=plt.axes()
axes.set_xlim([0,7])
axes.set_ylim([0,200])
plt.scatter(testx,testy,edgecolor='black')
plt.plot(xp,p8(xp),c='r')
# 在测试集上表现还可以,但实际上,比我们想像的要差,计算一下r方看看
from sklearn.metrics import r2_score
r2 = r2_score(test_y,p8(test_x))
print(r2)
# r方只有0.3,简直是不及格,所以模型并没有那么好
# 我们再来看看对训练集的拟合如何
r2=r2_score(y,p8(x))
print(r2)
# 结果显示为0.6,这并不奇怪,因为我们使用训练集数据训练了模型,而测试集数据对模型是未知的
# 既然8阶多项式拟合得并不好那多少合适呢,试试将8改为其他数看看
p8=np.poly1d(np.polyfit(x,y,7))
xp=np.linspace(0,7,100)
axes=plt.axes()
axes.set_xlim([0,7])
axes.set_ylim([0,200])
plt.scatter(x,y,edgecolor='black')
plt.plot(xp,p8(xp),c='g')
testx=np.array(test_x)
testy=np.array(test_y)
axes=plt.axes()
axes.set_xlim([0,7])
axes.set_ylim([0,200])
plt.scatter(testx,testy,edgecolor='black')
plt.plot(xp,p8(xp),c='r')
r2 = r2_score(test_y,p8(test_x))
print(r2)
r2=r2_score(y,p8(x))
print(r2)
# 结果发现阶数为7时最好,既没有出现过拟合,r方也达到了0.54
# k均值聚类
# 首先创建要聚类的随机数据
def creatdata(n,k):
np.random.seed(10)
points=float(n)/k
x=[]
for i in range(k):
income=np.random.uniform(20000,200000)
age=np.random.uniform(20,70)
for j in range(int(points)):
x.append([np.random.normal(income,10000),np.random.normal(age,2)])
x=np.array(x)
return x
# 接下来对数据实现k均值聚类
from sklearn.cluster import KMeans
from sklearn.preprocessing import scale
data=creatdata(100,5)
model = KMeans(n_clusters=5)
model=model.fit(scale(data)) # 一定记得对数据经行标准化
# 可以看一下每个数据带点都被分配到那个簇中
print(model.labels_)
# 对数据进行可视化
plt.scatter(data[:,0],data[:,1],c=model.labels_.astype(np.float),edgecolor='black')
# 结果看出有两个簇挨得很近,界限不是很分明,我们试试看把k改为其他数据会不会更好呢
data=creatdata(100,5)
model = KMeans(n_clusters=4)
model=model.fit(scale(data))
plt.scatter(data[:,0],data[:,1],c=model.labels_.astype(np.float),edgecolor='black')
# 测试结果发现,如果k变得很大时将数据点将会很分散,没有意义,k为5时的最优的n_clusters=4,如图
# 决策树
from sklearn import tree
import pandas as pd
# 先读入数据
df=pd.read_csv('./PastHires.csv',header=0)
df.head()
# 将数据类型转换为数值型,因为sklearn要求每个属性都为数值型
d1={'Y':1,'N':0}
d2={'BS':0,'MS':1,'PhD':2}
df['Employed?']=df['Employed?'].map(d1)
df['Top-tier school']=df['Top-tier school'].map(d1)
df['Interned']=df['Interned'].map(d1)
df['Hired']=df['Hired'].map(d1)
df['Level of Education']=df['Level of Education'].map(d2)
df.head()
# 提取出特征名称
features = list(df.columns[:6])
features
# 接下来创建y向量,并赋予它要预测的内容
y=df['Hired']
x=df[features]
clf=tree.DecisionTreeClassifier()
clf=clf.fit(x,y)
# 显示图形数据
from IPython.display import Image
from sklearn.externals.six import StringIO
import pydotplus
dot_data=StringIO()
tree.export_graphviz(clf,out_file=dot_data,feature_names=features)
graph=pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())
# 显示失败了。。。以后再看看怎么弄,毕竟很麻烦
# 接下来我们使用随机森林防止训练过拟合
from sklearn.ensemble import RandomForestClassifier
clf=RandomForestClassifier(n_estimators=10)
clf=clf.fit(x,y)
clf.predict([[10,1,4,0,0,0]]) # 预测一位有10年工作经、目前在职的求职者是否被录用,结果为被录取
clf.predict([[10,0,4,0,0,0]]) # 如果是一位同样有10年经验但目前不在职呢,结果仍然是1,即录取
# 支持向量机-svm
# 首先创建要聚类的随机数据
def creatdata(n,k):
np.random.seed(10)
points=float(n)/k
x=[]
y=[]
for i in range(k):
income=np.random.uniform(20000,200000)
age=np.random.uniform(20,70)
for j in range(int(points)):
x.append([np.random.normal(income,10000),np.random.normal(age,2)])
y.append(i)
x=np.array(x)
y=np.array(y)
return x,y
# 可视化一下
(x,y)=creatdata(100,5)
plt.scatter(x[:,0],x[:,1],c=y.astype(np.float),edgecolor='black')
# 下面我们用线性SVC将数据分为多个簇
from sklearn import svm,datasets
c=1
svc=svm.SVC(kernel='linear',C=c).fit(x,y)
# 接下来我们将结果可视化一下
def plotPredict(clf):
xx,yy=np.meshgrid(np.arange(0,250000,10),np.arange(10,70,0.5))
Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])
plt.figure(figsize=(8,6))
Z=Z.reshape(xx.shape)
plt.contourf(xx,yy,Z,cmap=plt.cm.Paired,alpha=0.8)
plt.scatter(x[:,0],x[:,1],c=y.astype(np.float),edgecolor='black')
plt.show()
plotPredict(svc)
# 下面我们来预测一下收入为200000,年龄为40的人位于那个簇
svc.predict([[200000,40]])
svc.predict([[50000,65]]) # 收入为50000,年龄为65的呢
好了,今天到此结束,自己也学的稀里糊涂的,哈哈哈