在学习数据分析的过程中,iris数据算是我第一个接触的比较官方的数据来源。这是一个关于鸢尾花的数据,有五个属性:花瓣的长和宽、萼片的长和宽、花的三类。其中三类鸢尾花分别是:setosa, versicolor, virginica。
数据库下载链接(点击这里)或者可以直接百度iris data。
美丽的鸢尾花
这里我用到的python库有
1、pandas
2、matploylib
3、seaborn
4、sklearn
iris = pd.read_csv(file_path,header=None)
iris.head()
我这里的数据没有列名称,所以我自己手动更改了列名称
col_list = ['sepal length in cm','sepal width in cm','petal length in cm','petal width in cm','class']
iris.columns = col_list
#很喜欢describe这个功能,可以从宏观上很快的浏览我们的数据
iris.describe()
这是总体的数据,没有按照花的品种分类。我们可以看到总共有150条数据。
set(iris.loc[:,'class'])
返回数据:{'setosa', 'versicolor', 'virginica'}
接下来我想要把数据按照品种分开, 这里我用到了groupby
group = iris.groupby('class')
group = group.agg({'sepal length in cm':np.average,
'sepal width in cm':np.average,
'petal length in cm':np.average,
'petal width in cm':np.average})
print group
下面我们来看下每个品种,花瓣的长和宽的关系是怎样的
#筛选setosa的数据,并作散点图
a = iris[iris['class']=='setosa']
ax = a.plot(kind="scatter",x = 'sepal length in cm',y ='sepal width in cm',label = 'seotsa')
#筛选versicolor的数据,并作散点图
b = iris[iris['class']=='versicolor']
b.plot(kind="scatter",x = 'sepal length in cm',y ='sepal width in cm',color = 'red',label = 'versicolor',ax = ax)
#筛选virginica的数据,并作散点图
c = iris[iris['class']=='virginica']
c.plot(kind="scatter",x = 'sepal length in cm',y ='sepal width in cm',color = 'green',label =
同理,我们可以画出花萼的长和宽的关系,这里我用了另外一种方法:
sns.FacetGrid(iris,hue='class',size =5).map(plt.scatter,'petal length in cm','petal width in cm
sns.pairplot(iris,hue ='class')
将4个变量两两对比,可以看到蓝色,也就是setosa和其他两类很容易区分开来,但是红色和绿色有点不好区分开。
接下来我们想要看看,是否可以根据花瓣的长和宽、萼片的长和宽来判断属于哪一类品种。
mapping = {'setosa':1, 'versicolor':2, 'virginica':3}
iris['map'] = iris.loc[:,'class'].map(mapping)
iris.head()
这里我们将花的品种转化为1,2,3类,加入了新的一列map
我们将我们的数据分成两块,我是这样理解的,一块是放特征数据,一块是放判断结果
data = iris.iloc[:,0:4]
target = iris.iloc[:,5]
from sklearn.linear_model import LogisticRegression #逻辑回归
from sklearn.cross_validation import train_test_split#分类训练值,测试值
from sklearn.metrics import classification_report #分析报告
from sklearn.metrics import confusion_matrix #混淆矩阵
x_train,x_test,y_train,y_test = train_test_split(data,target)
lr =LogisticRegression(C=10)
lr.fit(data,target)
pre_y = lr.predict(x_test)
print classification_report(y_test,pre_y)
1号类型的,准确率和召回率都是100%,很容易区分,但是2,3类型,不能做到100%准确
cnf = confusion_matrix(y_test,pre_y)
plt.matshow(cnf)
之后我应该要做一个AUC,ROC分析,这一段我还没有完全理解,所以给自己留个坑,下次继续填。
最后放一个鸢(yuan)尾花的百度百科,至少做完一个项目,还是要了解做的是啥吧。