机器学习——鸢尾花实例(附数据集资源)

# 这个项目是针对鸢尾花(Iris Flower)进行分类的一个项目,数据集是含鸢尾花的三个亚属的分类信息
# 通过机器学习算法生成一个模型,自动分类新数据到这个三个亚属的某一个中
# 该数据集的特点:
# 1.所有特征数据都是数字,不考虑如何导入和处理数据
# 2.这是一个分类问题,可以很方便地通过有监督地通过有监督学习算法来解决问题
# 3.这是一个多分类问题,也许需要一些特殊处理
# 4.所有的特征的数值采用相同的单位,不需要进行尺度的转换

# 导入类库
from pandas  import read_csv
from pandas.plotting import  scatter_matrix
from  matplotlib import  pyplot
from  sklearn.model_selection import train_test_split
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)

# 第二步概述数据
# 显示数据维度
print('数据维度:行 %s,列 %s'%dataset.shape)
# 查看数据的前十行
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()


# 第四步评估算法
# 通过不同的算法来创建模型,并评估他们的准确度,以便于找打最合适的算法。步骤如下:
# 分离出评估数据集
# 采用10折交叉验证来评估算法模型——随机将数据分为10份:9份用来训练模型,1份用来评估算法
# 生成6个不同的模型来预测新数据
# 选择最优模型

# 分离出评估数据集
# 按照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)
# 算法审查
# 线性算法 线性回归(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 = 10, 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()))
# 可以得出SVM算法准确度评分较高
# 箱线图比较算法
fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()

# 使用评估数据集评估算法
# 现在使用全部训练集生成支持向量机的算法模型,并用预留的评估数据集给出一个算法模型的报告
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))
# 精确率(precision)、召回率(recall)、F1值(F1-score)

鸢尾花数据集:
链接:https://pan.baidu.com/s/1ZPM1ijbx7DaJqMCr_mBOdg
提取码:7jg4

你可能感兴趣的:(Python,数据分析,机器学习)