1.数据从哪来
https://scikit-learn.org/stable/api/index.html
我们使用scikit-learnAPI辅助我们进行整个实验。在这个API中会存有一些数据的下载链接,他们还将数据封装好了,我们加载数据时(iris = load_iris())会返回一个字典类型的整个数据集。通过对字典的不同键的点击进入,我们就可以实现数据的加载。
python
from sklearn.datasets import load_iris
def load_data():
iris = load_iris()
x = iris.data
y = iris.target
print(iris.keys())
'''print("数据集特征值为:\n",x)
print("数据集标签为:\n",y)
print("数据集描述为:\n",iris.DESCR)
print("数据集特征值名称为:\n",iris.feature_names)
print("数据集标签名称为:\n",iris.target_names)'''
return x,y
2.有了数据,怎么去处理
在机器学习中,我们习惯将数据划分为测试集与训练集。sklearn中有一个函数可以起到这种效果。from sklearn.model_selection import train_test_split。
python
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
当我们划分好测试集与训练集后,我们需要对特征进行一些特征工程的操作,特征工程的基本流程:特征提取,**特征预处理,**特征选择,特征降维,特征重组。
主要下一步我们要进行特征预处理。(标准化,归一化)
我们需要调用skearn中的预处理中的标准化类,然后实例化一个scaler。
第一步在训练集 上去fit_transform,因为我们需要从他们身上去学习到数据集的方差,均值是什么,然后再用在训练集 学到标准差方差去对测试集做标准化处理。
python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
3.完成特征处理后,还要做啥?
处理完特征我们就可以将特征塞入模型中进行处理了。sklearn提供了模型的一站式服务,我们只需要先import需要用的模型类,然后实例化类就可以使用了
python
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier()
这里我们没有填入参数,默认是有参数的。我们这里想用网格搜索和交叉验证的方法去求取我们模型的最佳参数与证明我们模型的鲁棒性。
在代码中网格搜索和交叉验证其实就是一行:
导入GridSearchCV,然后实例化GridSearchCV(实例化后的模型 ,需要搜索的参数字典,cv=打算分几折进行交叉验证)
python
from sklearn.model_selection import train_test_split,GridSearchCV
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(x_train, y_train)
当我们实例化后,还需要调用其中的fit方法才能真正地开始模型的训练。
训练完之后的结果都会保存在实例grid_search中。可以利用下面的代码去看看有啥东西。
python
print("开始进行网格搜索...")
print("最佳参数:", grid_search.best_params_)
print("最佳得分:", grid_search.best_score_)
best_model = grid_search.best_estimator_
y_pred = best_model.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
print("测试集上的准确率:", accuracy)
整体的代码在下面,作为机器学习的helloworld,这里只需要对算法明晰,清楚每一步在干嘛,这里面的一些重要参数即可。构建从1.数据获取。2.数据预处理(划分数据训练集与测试集)3.特征工程(主要是特征预处理)4.模型实例化与模型训练5.模型评估验证与可视化 这个流程熟稔于心即可!下面是一些散装代码。
python
"""
Iris分类案例
1.加载数据
2.数据预处理
3.特征工程 -》特征提取 -》特征预处理
4.模型训练
5.模型评估
6.模型预测
"""
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import seaborn as sns
import matplotlib.pyplot as plt
# 1.加载鸢尾花数据集,并且查看数据集
def load_data():
iris = load_iris()
x = iris.data
y = iris.target
print(iris.keys())
'''print("数据集特征值为:\n",x)
print("数据集标签为:\n",y)
print("数据集描述为:\n",iris.DESCR)
print("数据集特征值名称为:\n",iris.feature_names)
print("数据集标签名称为:\n",iris.target_names)'''
return x,y
def show_iris_data():
# 将数据转换为DataFrame格式,便于数据处理
iris = load_iris()
# 数据转化为DataFrame格式
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['target'] = iris.target
print(iris_df.head())
# hue='target'表示根据类别进行颜色区分
sns.lmplot(data=iris_df, x='sepal length (cm)', y='sepal width (cm)', hue='target', fit_reg=False)
plt.title('Iris Dataset - Sepal Length vs Width')
plt.tight_layout()
plt.show()
def split_data():
iris = load_iris()
x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
def iris_case():
iris =load_iris()
x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
scalar = StandardScaler()
# 默认参数先去计算方差之类的数据,然后再进行转换
x_train = scalar.fit_transform(x_train)
# 直接对测试集进行转换
x_test = scalar.transform(x_test)
model = KNeighborsClassifier(n_neighbors=3)
model.fit(x_train,y_train)
y_pred = model.predict(x_test)
print("预测结果为:\n",y_pred)
accuracy = accuracy_score(y_test,y_pred)
print("准确率为:\n",accuracy)
def iris_last():
iris_data = load_iris()
x, y = iris_data.data, iris_data.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
# 特征工程 - 特征预处理
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
model = KNeighborsClassifier()
param_grid = {
'n_neighbors': [i for i in range(1, 11)]
}
# 创建网格搜索对象
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(x_train, y_train)
print("开始进行网格搜索...")
print("最佳参数:", grid_search.best_params_)
print("最佳得分:", grid_search.best_score_)
best_model = grid_search.best_estimator_
y_pred = best_model.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
print("测试集上的准确率:", accuracy)
if __name__ == "__main__":
iris_last()