机器学习包括了监督学习和非监督学习,非监督学习之后再说,监督学习就是指给定特征属性一、属性二.......属性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)支持向量机(回归和分类)
领取专属 10元无门槛券
私享最新 技术干货