上课笔记-机器学习(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是结合准确率和召回率的,调和平均数
相关文章推荐
- 机器学习笔记——利用sklearn中KNN算法实现鸢尾花分类
- 机器学习实战-kNN分类手写数字笔记
- 机器学习实战笔记(Python实现)-07-模型评估与分类性能度量
- 机器学习笔记2——分类
- 【机器学习笔记之三】CART 分类与回归树
- 机器学习(九):CS229ML课程笔记(5)——支持向量机(SVM),最优间隔分类,拉格朗日对偶性,坐标上升法,SMO
- [台大机器学习笔记整理]机器学习问题与算法的基本分类&由霍夫丁不等式论证机器学习的可行性
- 吴恩达Coursera机器学习课程笔记-定义分类
- 机器学习笔记2——K近邻法KNN(分类)
- 初识机器学习之决策树对鸢尾花进行分类
- 机器学习笔记(3)---K-近邻算法(1)---约会对象魅力程度分类
- 机器学习笔记-决策树跟分类规则
- 程序员的机器学习入门笔记(五):文本分类的入门介绍
- 机器学习分类算法 以Iris DataSet鸢尾花数据集为例
- 【机器学习入门】Andrew NG《Machine Learning》课程笔记之四:分类、逻辑回归和过拟合
- 机器学习问题分类--机器学习基石笔记
- 机器学习实战笔记(八):利用 AdaBoost 元算法提高分类性能
- 机器学习笔记1——感知机(分类)
- 机器学习实战笔记——分类之k-近邻算法