您的位置:首页 > 其它

上课笔记-机器学习(1)-鸢尾花分类

2019-01-16 20:53 218 查看

鸢尾花分类

1、内置的鸢尾花数据集(已经清洗过的了)

# 导入数据,用数据框查看
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris["data"], columns=iris.feature_names) #iris["data"]也可以写成iris.data
df["class"] = iris.target
df.head()

# 取得我们需要的数据
X = iris["data"]
y = iris["target"]
# 数据可视化-1(花瓣长度和宽度散点图)
%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(X[:,2], X[:,3], c=y)

# 数据可视化-2
import matplotlib.pyplot as plt
import seaborn as sns
sns.pairplot(df, hue="class")

# 对数据进行统计
df.groupby(by="class").count()


-------------------------------------------------我是正常的分割线---------------------------------------------
对iris数据集进行分类机器学习

# 引入第三方库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import  KNeighborsClassifier #最近邻算法(KNN)
from sklearn.linear_model import LogisticRegression #逻辑斯蒂可回归算法

#1、 KNN
# 读入数据集
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=20)

# 选择机器学习算法生成模型
# 1、KNN算法
#生成算法
knn = KNeighborsClassifier(n_neighbors=7)
#算法学习训练集
knn.fit(X_train, y_train)
print(knn)

# 预测
y_pred = knn.predict(X_test)
print("预测: ",y_pred)
print("实际: ",y_test)
print("KNN算法的准确度: {}".format(knn.score(X_train, y_train)))
print("KNN算法的准确度: {}".format(knn.score(X_test, y_test))) #过拟合和欠拟合

# #预测未知的数据,随意给了几个数据测试
# import numpy as np
# knn.predict(np.array([5.2, 1.4, 2.5, 1.2]).reshape(1,-1))
print("------------------------两种算法的分割线----------------------------")
#2、 逻辑回归分类
#生成算法
lr = LogisticRegression(C=2)
#算法学习
lr.fit(X_train, y_train)
print(lr) #打印后可以观察调整上方的参数
# 预测
y_pred = lr.predict(X_test)
print("预测: ",y_pred)
print("实际: ",y_test)
print("逻辑回归算法的准确度: {}".format(lr.score(X_train, y_train)))
print("逻辑回归算法的准确度: {}".format(lr.score(X_test, y_test))) #过拟合和欠拟合


-------------------------------------------------我是开心的分割线---------------------------------------------
2、有噪声的鸢尾花数据集

数据清洗

# 读入数据
import pandas as pd
iris = pd.read_csv("data/iris-data.csv")
iris.head()

# 观察数据
iris.info()
iris.describe() #描述数值型数据有多少个(count)


观察得出:

  • petal_width_cm列有5个缺失值
  • sepal_length_cm列的最小值似乎太小
# 绘图观察数据
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.pairplot(iris.dropna(), hue = "class") #sns.pairplot一次性画出两两图,dropna是去掉缺失值

观察发现:

  • sepel_length_cm列有异常数据,异常数据都属于iris-versicolor类别
  • 因为标注的误差导致类别多了两个(Iris-setossa和versicolor)
# 解决标注的类别错误
# pandas里的切片(loc和iloc,loc根据名字来,iloc是根据序号)
iris.loc[iris["class"]=="Iris-setossa","class"] = "Iris-setosa"#行和列,条件放在行里
iris.loc[iris["class"]=="versicolor","class"] = "Iris-versicolor" #找到错误数据并改正
iris["class"].unique()

# 再次绘图观察类别情况(解决类别的问题了)
sns.pairplot(iris.dropna(), hue = "class")

# 解决花瓣长度最小值异常的问题
# 观察数据基本位于4-8之间,看看是否有小于1的数据
iris.loc[iris["sepal_length_cm"]<1,]

  • 观察发现,应该是测量单位m和cm引起的误差
  • 解决方法:原数据x100
iris.loc[iris["sepal_length_cm"]<1,"sepal_length_cm"] *= 100
# 再次绘图观察(发现最左边和最下边黄色的异常值没有了)
sns.pairplot(iris.dropna(), hue = "class")

#解决花萼宽度的缺失值问题
# 首先观察缺失值
iris.info()
iris.loc[iris["petal_width_cm"].isnull(),] #打印出空的行


缺失值的解决方案有很多方法,根据实际情况选用:

  • 当缺失值的行占比非常小的时候,可以直接删除包含缺失值的行;
  • 使用平均值填充;(适用于本数据,因为数据集中,方差较小,不适合数值相差很大的时候)
  • 使用中位数填充;
  • 拉格朗日插值填充;
  • 算法预测填充;
  • 。。
#--- 采用均值填充缺失值
# 计算Iris-setosa类别的花萼宽度列的平均值
avg = iris.loc[iris["class"]=="Iris-setosa","petal_width_cm"].mean()
# 用均值填充相应的缺失值
iris.loc[iris["petal_width_cm"].isnull(),"petal_width_cm"] = round(avg, 1)
# 再次观察数据,基本没有问题
iris.info() #有没有缺失值
iris.describe() #有没有异常

# 将清洗好的数据保存到文件
iris.to_csv("data/iris-data-clean2.csv", index=False) #去掉index索引

-------------------------------------------------我是忙碌的分割线---------------------------------------------

3、机器学习过程(决策树算法)

# 引入第三方库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier #决策树算法

# 读入数据
iris = pd.read_csv("data/iris-data-clean2.csv")
iris.head()

# 从数据框中获取数据和目标(X和y) #(X是前四列的数据,第五列是目标,也就是y,是可以用字符串的)
#X = iris.iloc[:,0:4] 这个得到的是数据框(包括表头,然后我们不要表头,只要中间的数据)
X = iris.iloc[:,0:4].values
y = iris.iloc[:,-1].values

#划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

#选择机器学习算法建立模型(决策树)
dtc = DecisionTreeClassifier()

#模型学习
dtc.fit(X_train, y_train)
print(dtc)

#模型评估
print("决策树算法的准确度:", dtc.score(X_test, y_test))

#模型分类评估报告
from sklearn.metrics import classification_report
y_pred = dtc.predict(X_test)
print(classification_report(y_test, y_pred)) #实际的结果和预测的结果

# precision是准确率,也就是预测是该类的全部都对了,但是漏了几个预测称其他类了->recall是召回率,白血病案例中召回率很重要;因为类别极度不平均
# f1-score是结合准确率和召回率的,调和平均数

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: