审查分类算法及审查回归算法

  1.审查分类算法
  算法审查时选择合适的机器学习算法的主要方法之一。审查算法前并不知道哪个算法对问题最有效,必须设计一定的实验进行验证,从而找到对问题最有效的算法。

  1.1算法审查
  审查算法前没有办法判断哪个算法对数据集最有效,能够生成最优模型,必须通过一系列实验判断出哪些算法对问题有效,然后再进一步来选择算法。这个过程被叫做算法审查。
  在选择算法时,应该换一种思路,不是针对数据应该采用哪种算法,而是应该用数据来审查哪些算法。应该先猜测一下,什么算法会具有最好的效果。这是训练数据敏感性的好方法。建议对同一个数据集运用不同的方法,来审查算法的有效性,然后找到最有效的算法。下面时审查算法的几点注意:
  1.尝试多种代表性算法
  2.尝试多种机器学习的算法
  3.尝试多种模型

  1.2算法概述
  在分类算法中,目前存在很多类型的分类器:线性分类器,贝叶斯分类器,基于距离的分类器等。

  1.3线性算法
  逻辑回归和线性判别分析都是假定输入的数据符合高斯分布。
  1.3.1逻辑回归
  回归是一种极易理解的模型,表明自变量x与因变量的关系。逻辑回归实际上是一个分类算法而不是回归算法,通常是利用已知的自变量来预测一个离散型因变量的值。简单来说,它就是通过拟合一个逻辑函数来预测一个事件发生的概率。所以它预测的是一个概率值,它的输出值应该为0~1,因此非常适合处理二分类问题。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
#导入数据
filename = '/home/hadoop/DataSet/pima indians.csv'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,random_state=seed)
model = LogisticRegression()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

  1.3.2线性判别分析
  线性判别分析的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间有最佳的可分离性。因此,它是一种有效的特征抽取方法。使用这种方法能够使投影后模式样本的类间散布矩阵最大,并且类内散步矩阵最小。就是说,它能保证投影后模式样本在新的空间中有最小的类内距离和最大的类间距离,即模式在该空间有最佳的可分离性。线性判别分析与主要成分分析一样,被广泛应用在数据降维中。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
#导入数据
filename = '/home/hadoop/DataSet/pima indians.csv'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,random_state=seed)
model = LinearDiscriminantAnalysis()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

  1.4非线性算法
  1.4.1K近邻算法
  K近邻算法是一种理论上比较成熟的方法,也是最简单的机器学习方法之一。该方法的思路是:如果一个样本在特征空间中的K个最相似(特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。在KNN中,通过计算对象间距离来做为各个对象之间的非相似性指标,避免了对象之间的匹配问题,距离一般使用欧式距离或者曼哈顿距离;同时,KNN通过依据k个对象中占优的类别进行决策,而不是通过单一的对象类别决策。这就是KNN算法的优势。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
#导入数据
filename = '/home/hadoop/DataSet/pima indians.csv'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,random_state=seed)
model = KNeighborsClassifier()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

  1.4.2贝叶斯分类器
  贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其在所有类别上的后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。也就是说,贝叶斯分类器是最小错误率意义上的优化。对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大就认为待分类项属于哪个类别。贝叶斯分类器的特点如下:
  1.贝叶斯分类器是一种基于统计的分类器,它根据给定样本属于某一个具体类的概率来对其进行分类
  2.贝叶斯分类器的理论基础是贝叶斯理论
  3.贝叶斯分类器的一种简单形式是朴素贝叶斯分类器,与随机森林,神经网络等分类器都具有可比的性能
  4.贝叶斯分类器是一种增量型的分类器
  在贝叶斯分类器中,对输入数据同样做了符合高斯分布的假设。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.naive_bayes import GaussianNB
#导入数据
filename = '/home/hadoop/DataSet/pima indians.csv'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,random_state=seed)
model = GaussianNB()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

  1.4.3分类与回归树
  分类与回归树CART回归树,树的构建基于基尼指数。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为”否“的分支。这样的决策树等价与递归二分每个特征,将输入空间(特征空间)划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。CART算法由以下两步组成:
  1.树的生成:基于训练数据集生成决策树,生成的决策树要尽量大
  2.树的剪枝:用验证数据集对已生成的树进行剪枝,并选择最优子树,这时以损失函数最小作为剪枝的标准
  决策树的生成就是通过递归构建二叉决策树的过程,对回归树用平方误差最小化准则,或对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
#导入数据
filename = '/home/hadoop/DataSet/pima indians.csv'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,random_state=seed)
model = DecisionTreeClassifier()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

  1.4.4支持向量机
  支持向量机在解决小样本,非线性及高维模式识别中表现出了许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。在机器学习中,支持向量机是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
#导入数据
filename = '/home/hadoop/DataSet/pima indians.csv'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,random_state=seed)
model = SVC()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

  2.审查回归算法

  2.1算法概述
  将审查七种回归算法
  a.线性回归算法(线性)
  b.岭回归算法(线性)
  c.Lasso回归算法(线性)
  d.弹性网络回归算法(线性)
  e.K近邻算法(KNN)(非线性)
  f.CART(非线性)
  g.支持向量机(SVM)

  2.1.1线性回归算法
  线性回归算法是利用数理统计中的回归分析,来确定两种或两种以上变量之间相互依赖的定量关系的一种统计分析方法,运用十分广泛。在回归分析中,只包括一个自变量和一个因变量,且两者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系。则称为多元线性回归分析。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
#导入数据
filename = '/home/hadoop/DataSet/housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed)
model = LinearRegression()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model,X,Y,cv=kfold,scoring=scoring)
print('Linear Regression:%.3f' % result.mean())
print(result)

  2.1.2岭回归算法
  岭回归算法是一种专门用于共线性数据分析的有偏估计回归方法,实际上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息,降低精度为代价,获得回归系数更符合实际,更可靠的回归方法,对病态数据的拟合要强于最小二乘法。L2正则化回归

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import Ridge
#导入数据
filename = '/home/hadoop/DataSet/housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed)
model = Ridge()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model,X,Y,cv=kfold,scoring=scoring)
print('Ridge Regression:%.3f'%result.mean())

  2.1.3LASSO回归算法
  LASSO回归算法和岭回归算法类似,LASSO回归算法也会惩罚回归系数,在LASSO回归中会惩罚回归系数的绝对值大小。此外,它能够减少变化程度并提高线性回归模型的精度。LASSO回归算法和岭回归算法有一点不同,它使用的惩罚函数是绝对值,而不是平方。这导致惩罚值使一些参数估计结果等于零。使用惩罚值越大,进一步估计会使缩小值越趋近于零。这将导致我们要从给定的n个变量中选择变量。如果预测的一组变量高度相似,LASSO回归算法会选择其中的一个变量,并将其他的变量收缩为零。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import Lasso
#导入数据
filename = '/home/hadoop/DataSet/housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed)
model = Lasso()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model,X,Y,cv=kfold,scoring=scoring)
print('Lasso T=Regression:%.3f'%result.mean())

  2.1.4弹性网络回归算法
  弹性网络回归算法是LASSO回归算法和岭回归算法的混合体,在模型训练时,弹性网络回归算法综合使用L1和L2两种正则化方法。当有多个相关的特征时,弹性网络回归算法时很有用的,LASSO回归算法会随机挑选算法中的一个,而弹性网络回归算法则会选择两个。与LASSO回归算法和岭回归算法相比,弹性回归算法的有点是,它允许弹性网络回归继承循环状态下岭回归的一些稳定性。另外,在高度相关变量的情况下,它会产生群体效应;选择变量的数目没有限制;可以承受双重收缩。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import ElasticNet
#导入数据
filename = '/home/hadoop/DataSet/housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed)
model = ElasticNet()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model,X,Y,cv=kfold,scoring=scoring)
print('ElasticNet Regression:%.3f'%result.mean())

  2.1.5K近邻算法
  K近邻算法是按照距离来预测结果。默认的距离参数为闵氏距离,可以指定曼哈顿距离作为距离的计算方式。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsRegressor
#导入数据
filename = '/home/hadoop/DataSet/housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed)
model = KNeighborsRegressor()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model,X,Y,cv=kfold,scoring=scoring)
print('KNeighbors Regression:%.3f'%result.mean())

  2.1.6分类与回归树

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
#导入数据
filename = '/home/hadoop/DataSet/housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed)
model = DecisionTreeRegressor()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model,X,Y,cv=kfold,scoring=scoring)
print('CART:%.3f'%result.mean())

  2.1.7支持向量机

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVR
#导入数据
filename = '/home/hadoop/DataSet/housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed)
model = SVR()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model,X,Y,cv=kfold,scoring=scoring)
print('SVM:%.3f'%result.mean())

你可能感兴趣的:(机器学习Python实践)