首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

机器学习整体流程总结

机器学习包括了监督学习和非监督学习,非监督学习之后再说,监督学习就是指给定特征属性一、属性二.......属性N,以及目标属性Y,共同构成一组样本,多组样本构成一张列表,里面全是数据,即我们的训练集x_tain,y_train。机器学习的目的:学习到各个特征属性和目标属性之间的关系,以此来对新样本的特征属性进行分析,归类或回归,得到新样本对应的目标属性。

总体看,机器学习分成:

一、读取数据、初步分析

二、特征工程

三、构建模型并学习

三、预测新样本、评估改进模型

四、可视化输出

下面分别来看

一、读取数据、特征处理

1)使用pandas倒入数据

names=['属性一','属性二','属性三','属性四','结果']

datas=pd.read_csv(path,names=['属性一','属性二','属性三','属性四','结果'],sep=',')

输出:

2)调用shape,查看多少行(样本数)、多少列(属性数)

输入:datas.shape

输出:

(83, 5)

共有83个样本,5个属性(特征属性加目标属性)

3)调用dtypes,查看每个字段数据的类型

输入:datas.dtypes

输出:

属性一 float64属性二 float64属性三 float64属性四 float64结果 int64dtype: object

五个字段的属性全部是64位浮点数

4)调用describe(),查看各字段的数据分布

输入:datas.describe()

输出:

5)调用groupby().size(),查看数据分组后的分布(用于分类算法)

输入:datas.groupby('结果').size()

输出:

结果1 242 303 29dtype: int64

表示这三类目标属性下,样本数量的对比,是比较平衡的。

6)调用corr(method='pearson'),查看各特征属性之间的相关性,如果相关性很高,可以进行降维处理,减少特征属性个数。

输入:datas.corr(method='pearson')

输出:

属性三、四之间的相关系数达0.96,比较高的,可以考虑去掉其中一个属性。

7)调用skew(),查看数据在正态分布下的偏度,左偏还是右偏,为0时说明数据的偏差非常小,大部分集中在正太分布中轴线。

输入:datas.skew()

输出:

属性一 0.107646属性二 0.372181属性三 -0.417884属性四 -0.290420结果 -0.110166dtype: float64

8)调用.plot(kind='density',subplots=True,layout=(3,2),sharex=False),正太分布可视化,更加直观。

输入:datas..plot(kind='density',subplots=True,layout=(3,2),sharex=False)

输出:

更加直观审查每个字段的数据正太分布,plot的参数以后研究:

DataFrame.plot(x=None, y=None, kind='line', ax=None,

subplots=False, sharex=None, sharey=False, layout=None,figsize=None, use_index=True, title=None, grid=None, legend=True, style=None, logx=False,

logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None,

rot=None,xerr=None,secondary_y=False, sort_columns=False, **kwds)

二、特征工程:

1)调用MinMaxScaler(),fit_transform,将数据缩放到一个指定的范围,调整数据尺度。

输入:

array=datas.values

X=array[:,0:4]

Y=array[:,0:4]

ss=MinMaxScaler()

newx=ss.fit_transform(X)

newx

输出:

2)正太化数据

3)标准化数据

4)二值数据:调用Binarizer,让数据转化为0或1。

输入:

array=datas.values

X=array[:,0:4]

Y=array[:,0:4]

ss=Binarizer(threshold=2.0).fit(X)

newx=ss.fit_transform(X)

newx

输出:

array([[1., 1., 0., 0.], [1., 1., 0., 0.], [1., 1., 0., 0.],

5)单变量特征选定:调用SelectKbest选定k个最优特征。

输入:

array=datas.values

X=array[:,0:4]

Y=array[:,4]

test=SelectKBest(score_func=chi2,k=3)

fit=test.fit(X,Y)

newx=fit.transform(X)

newx

输出:

array([[5.1, 1.4, 0.2], [4.9, 1.4, 0.2], [4.7, 1.3, 0.2],

经过卡方检验,删除第三个属性,这也与相关系数得到的结果相同,属性三、四的相关系数等于0.96,过于相关,删去一个。

6)调用PCA主要成分分析,实现数据降维。

输入:

array=datas.values

X=array[:,0:4]

Y=array[:,4]

pca = PCA(n_components=3)

newx = pca.fit_transform(X)

newx

输出:

7)递归特征消除

8)特征重要性

三、模型选择

先分割好训练集和测试集:x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2,random_state=6)

1)线性回归(回归):y=a0+a1x1+a2x2+... 其中a0是截距,x1、x2...是样本的特征属性,y是对应的目标属性,算法要求的就是a1、a2...和a0

输入:

model=LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

model.fit(x_train,y_train)

predicted=model.predict(x_test)

scores=model.score(x_test,y_test)

model.coef_

model.intercept_

print('Y=属性一*%.2f+属性二*%.2f+属性三*%.2f+属性四*%.2f+%.2f'%(model.coef_[0],model.coef_[1],model.coef_[2],model.coef_[3],model.intercept_))

print(scores)

输出:

预测准确率一般,可以考虑利用卡方检验实现特征属性降维。

LinearRegression()参数后面再说。

2)岭回归(回归)Ridge是线性回归加L2正则平方,以防止过拟合

输入:

model=Ridge(alpha=5.0,random_state=6)

model.fit(x_train,y_train)

predicted=model.predict(x_test)

scores=model.score(x_test,y_test)

scores

输出:

模型效果优于单纯的线性回归,当alpha=1时分数仅0.86,可见提高alpha又处于提升模型效果。同样,参数后面说。

Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None, normalize=False, random_state=6, solver='auto', tol=0.001)

3)拉索回归()回归Lasso,加入惩罚函数L1正则绝对值,防止过拟合

输入:

model=Lasso(alpha=1.0,random_state=6)

model.fit(x_train,y_train)

predicted=model.predict(x_test)

scores=model.score(x_test,y_test)

scores

输出:

效果不理想。参数

Lasso(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=6,selection='cyclic', tol=0.0001, warm_start=False)

4)弹性网络回归(回归),同时使用L1和L2正则。

输入:

model=ElasticNet(alpha=1.0,l1_ratio=0.1,random_state=6)

model.fit(x_train,y_train)

predicted=model.predict(x_test)

scores=model.score(x_test,y_test)

scores

输出:

随着l1_ratio的降低,评分逐步升高,并且对alpha非常敏感。参数:

ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.1,max_iter=1000, normalize=False, positive=False, precompute=False,random_state=6, selection='cyclic', tol=0.0001, warm_start=False)

5)K近邻(回归)

6)决策树(回归和分类)

7)支持向量机(回归和分类)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180708G1H0K300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券