一、数据准备
下载并导入数据集:
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()))