美文网首页机器学习算法
从鸢尾花入门机器学习

从鸢尾花入门机器学习

作者: 潘雪雯 | 来源:发表于2018-11-07 21:15 被阅读28次
    #数据可视化一般通过较底层的matplotlib库和较高层的Seaborn库实现的
    import pandas as pd
    import warnings
    warnings.filterwarnings("ignore")
    import seaborn as sns
    import matplotlib.pyplot as plt
    sns.set(style="white", color_codes=True)
    

    数据集从这里下载

    iris = pd.read_csv("Iris.csv")
    iris.head()
    
    前五行数据展示

    每个种类的数量

    iris["Species"].value_counts()
    
    每个种类的数据量和类型

    kind为scatter是指散点图

    iris.plot(kind="scatter", x="SepalLengthCm", y="SepalWidthCm")
    
    长和宽的关系图

    两个变量的画图,图的尺寸大小为5,比上面的画图更密集

    sns.jointplot(x="SepalLengthCm", y="SepalWidthCm", data=iris, size=5)
    
    image.png

    上图中缺少的一条信息是每种植物的种类,我们将使用seaborn的FaceGrid按物种为散点图着色

    sns.FacetGrid(iris, hue="Species", size=5) \
       .map(plt.scatter, "SepalLengthCm", "SepalWidthCm") \
       .add_legend()
    
    image.png

    箱形图是一种用作显示一组数据分散情况资料的统计图,其能显示出一组数据的最大值,最小值,中位数及上下四分位数

    sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
    
    image.png
    ax = sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
    ax = sns.stripplot(x="Species", y="PetalLengthCm", data=iris, jitter=True, edgecolor="gray")
    
    image.png
    sns.violinplot(x="Species", y="PetalLengthCm", data=iris, size=6)
    

    小提琴绘图以基础分布的核密度估计为特征


    image.png

    用于查看单变量关系的最终seaborn图是kdeplot,它可以创建并可视化底层特征的核密度估计

    sns.FacetGrid(iris, hue="Species", size=6) \
       .map(sns.kdeplot, "PetalLengthCm") \
       .add_legend()
    
    image.png

    另一个比较有用的seaborn图是pairplot,其显示了每对功能之间双变量的关系。在配对图中,我们将看到iris-setosa物种在所有特征组合中与其他两个物种分开
    去掉id列的物种变量图

    sns.pairplot(iris.drop("Id", axis=1), hue="Species", size=3)
    
    image.png

    对图中的对角线元素默认显示直方图,我们可以更新这些元素以显示其他内容如kde

    sns.pairplot(iris.drop("Id", axis=1), hue="Species", size=3, diag_kind="kde")
    
    image.png
    iris.drop("Id", axis=1).boxplot(by="Species", figsize=(12, 6))
    
    image.png

    还有一种酷炫的panda技术叫做安德鲁斯曲线,该曲线涉及使用样本的属性作为傅里叶级数的系数r然后绘制他们

    from pandas.tools.plotting import andrews_curves
    andrews_curves(iris.drop("Id", axis=1), "Species")
    
    image.png

    另一种多变量可视化pandas技术是parallel_coordinates
    平行坐标将每个要素绘制在单独的列上,然后绘制线条,连接每个数据样本的功能

    from pandas.tools.plotting import parallel_coordinates
    parallel_coordinates(iris.drop("Id", axis=1), "Species")
    
    image.png

    最后的多变量可视化pandas技术是radviz,其将每个特征作为一个点放在2D平面上进行模拟,使每个样品利用特征的相对值通过弹簧加权连接这些点

    from pandas.tools.plotting import radviz
    radviz(iris.drop("Id", axis=1), "Species")
    
    image.png
    iris.target
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
    

    创建训练集和测试集

    from sklearn.model_selection import train_test_split
    X = iris.data[:, :2]             # 取前两列数据
    Y = iris.target
    #X即被划分的样本特征集,Y即被划分的样本标签
    x_train, x_test, y_train, y_test = train_test_split(X,Y, test_size = 0.3, random_state = 0)
    # 画出训练集数据点
    trace = go.Scatter(x = X[:,0], y = X[:,1], mode = 'markers', 
                        marker = dict(color = np.random.randn(150),size = 10, colorscale='Viridis',showscale=False))
    layout = go.Layout(title = '训练点', xaxis=dict(title='花萼长度 Sepal length', showgrid=False),
                        yaxis=dict(title='花萼宽度 Sepal width',showgrid=False),
                        width = 700, height = 380)
    fig = go.Figure(data=[trace], layout=layout)
    iplot(fig)
    
    image.png
    from sklearn.linear_model import LogisticRegression
    #导入模型,调用LogisticRegression函数
    #penalty正则化选择参数 C 正则项系数的倒数 solver使用newton-cg去解决多项式loss 
    #multi_class在全局的概率分布上最小化损失
    # lr = LogisticRegression(C = 1e5) # C: Inverse of regularization strength
    lr = LogisticRegression(penalty='l2',solver='newton-cg',multi_class='multinomial')
    lr.fit(x_train,y_train)
    print("Logistic Regression模型训练集的准确率:%.3f" %lr.score(x_train, y_train))
    print("Logistic Regression模型测试集的准确率:%.3f" %lr.score(x_test, y_test))
    

    Logistic Regression模型训练集的准确率:0.829
    Logistic Regression模型测试集的准确率:0.822

    from sklearn import metrics
    y_hat = lr.predict(x_test)
    accuracy = metrics.accuracy_score(y_test, y_hat) #错误率,也就是np.average(y_test==y_pred)
    print("Logistic Regression模型正确率:%.3f" %accuracy)
    

    Logistic Regression模型正确率:0.822

    target_names = ['setosa', 'versicolor', 'virginica']
    print(metrics.classification_report(y_test, y_hat, target_names = target_names))
    
             precision    recall  f1-score   support
    
     setosa       1.00      1.00      1.00        16
    

    versicolor 0.81 0.72 0.76 18
    virginica 0.62 0.73 0.67 11

    avg / total 0.83 0.82 0.82 45

    参考1
    参考2
    画图神器

    相关文章

      网友评论

        本文标题:从鸢尾花入门机器学习

        本文链接:https://www.haomeiwen.com/subject/cpemxqtx.html