数据分析学习7

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的呢

好了,今天到此结束,自己也学的稀里糊涂的,哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灯下夜无眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值