从鸢尾花入门机器学习
#数据可视化一般通过较底层的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