鸢尾花分类

一、数据准备

下载并导入数据集:

import pandas as pd
data = pd.read_csv(r"C:\Users\mm202\Desktop\Iris.csv",header=None)
print(data.head())

也可以使用scikit-learn库自带的标准数据集进行导入

from sklearn.datasets import load_iris
#加载数据集
iris = load_iris()
data = pd.DataFrame(data=iris.data,columns=iris.feature_names)
data['target'] = iris.target
data['target_names'] = data['target'].apply(lambda x:iris.target_names[x])

#查看数据
print(data.head())  #查看数据前五行
print('-----------------')
print(data.info())   #查看数据的基本信息
print('-----------------')
print(data.describe())   #查看数据集的统计信息

二、数据可视化

使用seaborn的pairplot函数绘制特征之间的分布图

import seaborn as sns
import matplotlib.pyplot as plt

#绘制特征分布图
sns.pairplot(data,hue='target',markers=["o","s","D"])  #target列作图,使用不同标记
plt.show()

三、数据预处理

处理缺失值,标准化或归一化等

from sklearn.preprocessing import StandardScaler
#检查是否有缺失值
print(data.isnull().sum())   #每列缺失值数量

#标准化特征值
scaler = StandardScaler()    #创建一个StandardScaler对象
data[iris.feature_names] = scaler.fit_transform(data[iris.feature_names])   #对特征值标准化处理,使其均值为0,标准差为1

#查看标准化后的数据
print(data.head())  

四、数据分割

将数据分成训练集和测试集。我们可以在训练集上训练模型,并在数据集上评估模型的泛化能力,有利于检测模型是否过拟合或欠拟合。

from sklearn.model_selection import train_test_split

#分割数据集
x = data[iris.feature_names]   
y = data['target']
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=42)  

#查看分割后数据集大小
print(f"训练集大小:{x_train.shape[0]},测试集大小:{x_test.shape[0]}")

五、选择模型(四种方法)

1.SVM

# .flat 将矩阵转变成一维数组 (与ravel()的区别:flatten:返回的是拷贝
print("grid_test = \n", grid_test)
# print("x = \n",x)
grid_hat = classifier.predict(grid_test)       # 预测分类值
print("grid_hat = \n", grid_hat)
# print(x1.shape())
grid_hat = grid_hat.reshape(x1.shape)  # 使之与输入的形状相同
# 2.指定默认字体
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False 
# 3.绘制
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
alpha=0.5
plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light) # 预测值的显示
# plt.scatter(x[:, 0], x[:, 1], c=y, edgecolors='k', s=50, cmap=cm_dark)  # 样本
plt.plot(x[:, 0], x[:, 1], 'o', alpha=alpha, color='blue', markeredgecolor='k')
plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolors='none', zorder=10)  # 圈中测试集样本
plt.xlabel(u'花萼长度', fontsize=13)
plt.ylabel(u'花萼宽度', fontsize=13)
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.title(u'鸢尾花SVM二特征分类', fontsize=15)
# plt.grid()
plt.show()

2.k-means聚类

# 2.取特征空间中的4个维度
X = iris.data[:, :4]  
# 3.搭建模型,构造KMeans聚类器,聚类个数为3
estimator = KMeans(n_clusters=3)
#开始聚类训练   
estimator.fit(X)
# 获取聚类标签
label_pred = estimator.labels_ 
# 绘制数据分布图(数据可视化)
plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='see')  
plt.xlabel('petal length')  
plt.ylabel('petal width')  
plt.legend(loc=2)  
plt.show()  
# 绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0')  
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1')  
plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2')  
#花瓣的长宽
plt.xlabel('petal length')  
plt.ylabel('petal width')  
plt.legend(loc=2)  
plt.show() 

3.线性回归

#获取花萼的长(x)和宽(y)
x = [n[0] for n in iris.data]
y = [n[1] for n in iris.data]
import numpy as np #转换成数组
x = np.array(x).reshape(len(x),1)
y = np.array(y).reshape(len(y),1)
#第二步 导入Sklearn机器学习扩展包中线性回归模型,然后进行训练和预测  
classifier = LinearRegression()
# 开始训练
classifier.fit(x,y)
# 预测(根据花萼长来预测花萼的宽)
pre = classifier.predict(x)

#第三步 画图(数据可视化)
plt.scatter(x,y,s=100)
plt.plot(x,pre,"r-",linewidth=4)
#花萼的长宽
plt.xlabel('calycinal length')  
plt.ylabel('calycinall width')  
for idx, m in enumerate(x):
    plt.plot([m,m],[y[idx],pre[idx]], 'g-')
plt.show()
# 做预测,花萼长度为5.0,预测花萼宽度是多少
print ('[线性回归]花萼长度为5.0,预测花萼宽度是',classifier.predict([[5.0]]))

四、朴素贝叶斯

import sklearn
from sklearn.model_selection import train_test_split
x = iris.data
y = iris.target 
# 2.将原始数据集划分成训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=42)  
# 3.搭建模型,训练高斯贝叶斯分类器
classifier = GaussianNB()
#开始训练
classifier.fit(x_train, y_train)
# 4.计算svm分类器的准确率
print('高斯贝叶斯输出训练集的准确率为: %.2f' % classifier.score(x_train, y_train))
print('高斯贝叶斯输出测试集的准确率为: %.2f' % classifier.score(x_test, y_test))

六、评估模型

from sklearn.model_selection import train_test_split, cross_val_score  
from sklearn.preprocessing import StandardScaler  
from sklearn.svm import SVC

# 使用交叉验证来评估模型  
# 这里使用5折交叉验证  
scores = cross_val_score(classifier,data[iris.feature_names], y, cv=5)  
  
print("Accuracy scores for each fold of cross validation:", scores)  
print("Mean accuracy: {:.2f}".format(scores.mean()))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值