机器学习
机器学习项目步骤
( 1 )导入数据。( 2)概述数据。( 3)数据可视化。( 4)评估算法。( 5)实施预测。
导入数据
#导入类库
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
from sklearn.model_selection import train_test_splat
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
#导入数据
filename ='iris.data.csv'
names = ['separ-length','separ-width','petal-length','petal-width', 'class']
dataset = read_csv(filename, names=names)
概述数据
1.从以下几个角度来审查数据:( 1 )数据的维度。(2)查看数据自身。
(1)数据维度:通过查看数据的维度,可以对数据集有一个大概的了解,如数据集中有多少行数据、数据有几个属性等。
(2)查看数据自身也是一个很好的理解数据的方法,通过查看数据可以直观地看到数据的特征、数据的类型,以及大概的数据分布范围等。
2.统计描述数据
数据特征的统计描述信息包括数据的行数、中位值、最大值、最小值、均值、四分位值等统计数据信息。
3.数据分类分布
看数据在不同分类的分布情况,执行程序后得到的将是每个分类数据量的绝对的数值,看一下各个分类的数据分布是否均衡。
当数据分布不平衡时,需要对数据进行处理,调整数据到相对平衡的状态。调整数据平衡时有以下几种方法:
·扩大数据样本:这是一个容易被忽视的选择。一个更大的数据集,就有可能挖掘出不同的或许更平 衡的方面提高算法模型的准确度。
·数据的重新抽样:过抽样(复制少数类样本)和欠抽样(删除多数类样本)。当数据量很大时可以考虑测试欠抽样(大于一万条记录),当数据量比较少时可以考虑过抽样。
·尝试生成人工样本:一种简单的生成人工样本的方法是从少数类的实例中随机抽样特征属性,生成更多的数据。
·异常检测和变化检测:尝试用不同的观点进行思考,以解决问题。异常检测是对罕见事件的检测。这种思维的转变在于考虑以小类作为异常值类,它可以帮助获得一种新方法来分离和分类样本。
#显示数据维度
print('数据维度:行%s,列%s' % dataset.shape)
#查看数据的前10行
print (dataset.head (10))
#统计描述数据信息
print(dataset.describe())
#分类分布情况
print(dataset.groupby('class').size())
数据可视化
通过对数据集的审查,对数据有了一个基本的了解,接下来将通过图表来进一步查看数据特征的分布情况和数据不同特征之间的相互关系。
·使用单变量图表可以更好地理解每一个特征属性。
·多变量图表用于理解不同特征属性之间的关系。
单变量图表
单变量图表可以显示每一个单独的特征属性,因为每个特征属性都是数字,因此我们可以通过箱线图来展示属性与中位值的离散速度。
#籍线图
dataset.plot(kind='box',subplots=True, layout=(2,2), sharex=False, sharey=False)
pyplot.show()
#直方图
dataset.hist()
pyplot.show()
多变量图表
通过多变量图表可以查看不同特征属性之间的关系。我们通过散点矩阵图来查看每个属性之间的影响关系。
#散点矩阵图
scatter_matrix(dataset)
pyplot.show()
评估算法
通过不同的算法来创建模型,并评估它们的准确度,以便找到最合适的算法。将按照下面的步骤进行操作:( 1 )分离出评估数据集。(2)采用10折交叉验证来评估算法模型。( 3)生成6个不同的模型来预测新数据。( 4)选择最优模型。
(1)分离出评估数据集
模型被创建后需要知道创建的模型是否足够好。在选择算法的过程中会采用统计学方法来评估算法模型。但是,我们更想知道算法模型对真实数据的准确度如何,这就是保留一部分数据来评估算法模型的主要原因 。
#按照 80%的训练数据集 , 20%的评估数据集来分离数据。
array = dataset.values
X = array[ : , 0: 4]
Y = array[:, 4]
validation_size = 0.2
seed = 7
X_train, X_validation, Y_train, Y_validation = \
train_test_split(X, Y, test_size=validation_size,
random_state=seed)
#现在就分离出了X_train和Y_train用来训练算法创建模型,x_validation和Y_validation在后面会用来验证评估模型。
(2)采用10折交叉验证来评估算法模型
10折交叉验证是随机地将数据分成10份:9份用来训练模型,1份用来评估算法。后面会使用相同的数据对每一种算法进行训练和评估,并从中选择最好的模型。
(3)生成6个不同的模型来预测新数据
接下来评估六种不同的算法:线性回归(LR)、线性判别分析(LDA)、 K近邻(KNN)、分类与回归树(CART)、贝叶斯分类器(NB)、·支持向量机(SVM)。
#算法审查
models={}
models['LR']= LogisticRegression()
models['LDA'] = LinearDiscriminantAnalysis()
models['KNN'] = KNeighborsClassifier()
models['CART'] = DecisionTreeClassifier()
models['NB'] = GaussianNB()
models['SVM'] = SVC()
#评估算法
results = {}
for key in models:
kfold = KFold(n_splits=lO,random_state=seed)
cv_results = cross_val_score(models[key], X_train,
Y_train, cv=kfold, scoring='accuracy')
results.append(cv_results)
print('%s:%f (%f)' %(key,cv_results.mean(),
cv_results.std()))
(4)选择最优模型。
执行上面代码,查看结果
可通过创建箱线图,通过图表比较算法评估结果
#箱线图比较算法
fig = pyplot.figure()
fig.suptitle ('Algorithm Comparison')
ax= fig.add_subplot(lll)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()
实施预测
评估的结果显示,支持向量机(SVM)是准确度最高的算法。然后使用预留的评估数据集来验证这个算法模型。这将会对生成的算法模型的准确度有一个更加直观的认识。
#使用评估数据集评估算法
svm = SVC()
svm.fit(X=X_train, y=Y_train)
predictions= svm.predict(X_validation)
print(accuracy_score(Y_validation,predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions))