初入机器学习

Start

下载

  1. !!!!!先下载:Numpy、matplotlib、Scipy!!!!!

  2. 才能正常下载(有镜像源):pip install -i Simple Index scikit-learn

特征工程

数据集

学习阶段数据集:sklearn、kaggle、UCI

sklearn数据集

  1. 小规模:datasets.load_()

  2. 大规模:datasets.fetch_(data_home=None)

  3. 数据集的返回值:

# 导入鸢尾花数据集
from sklearn.datasets import load_iris
​
​
def datasets_demo():
    # sklearn数据集使用
    iris = load_iris()
    print("鸢尾花数据集:", iris)
    print("数据集描述:", iris["DESCR"])
    print("特征名字:", iris.feature_names)
    print("特征值:", iris.data, iris.data.shape)
​
    return None
​
​
if __name__ == '__main__':
    datasets_demo()

数据集划分

  • 训练集特征值:x_train

  • 测试集特征值:x_test

  • 训练集目标值:y_train

  • 测试集目标值: y_test

# 导入鸢尾花数据集
from sklearn.datasets import load_iris
# 导入数据集划分模块
from sklearn.model_selection import train_test_split


def datasets_demo():
    # 获取鸢尾花数据集
    iris = load_iris()

    # 数据集划分
    # iris.data: Iris数据集的特征(总共有四个特征)
    # random_state = 22: 控制随机数生成器的种子,以相同的方式分割数据,从而确保结果的可重复性
    # test_size: 默认情况下,75%的数据分配给训练集,剩下的25%分配给测试集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, "\n", x_train.shape)

    return None


if __name__ == '__main__':
    datasets_demo()

特征提取

特征提取API:sklearn.feature_extraction

将任意数据转换为可用于机器学习的数字特征

字典 DictVectorizer

将类别转换成one-hot编码

# DictVectorizer将字典列表转换成 NumPy 数组或稀疏矩阵
from sklearn.feature_extraction import DictVectorizer


def dict_demo():
    # 字典特征提取
    data = [{"city": "北京", "temperature": 100}, {"city": "上海", "temperature": 60}, {"city": "深圳", "temperature": 30}]
    # 1、实例化一个转换器
    transfer = DictVectorizer(sparse=False)  # sparse=True为稀疏矩阵
    # 2、调用fit_transform():先学习(即“拟合”)字典中的键作为特征名,然后将 data 列表中的字典转换为 NumPy 数组
    data_new = transfer.fit_transform(data)
    print(data_new)
    print("特征名字:", transfer.get_feature_names_out())  # get_feature_names_out获取特征名

    return None


if __name__ == '__main__':
    dict_demo()

文本 CountVectorizer

英文文本特征提取

# CountVectorizer将文本数据转换为数值特征矩阵
from sklearn.feature_extraction.text import CountVectorizer


def count_demo():
    data = ["lift is short, i like like python", "lift is too long, i dislike python"]

    # 实例化一个转换器
    transfer = CountVectorizer()

    # 调用fit_transform
    data_new = transfer.fit_transform(data)

    print("出现的次数:", data_new.toarray())  # toarray()转换二维数组
    print("特征名字:", transfer.get_feature_names_out())


if __name__ == '__main__':
    count_demo()

中文文本特征提取 jieba

# CountVectorizer将文本数据转换为数值特征矩阵
from sklearn.feature_extraction.text import CountVectorizer
# 导入jieba包, 精确模式进行分词
import jieba


def count_chinese_dome():

    # 1、将中文文本进行分词
    data = ["也很不错,这个课非常适合第一次入门机器学习,尽管大部分内容是在掉包。",
           "但其中也不乏穿插算法的简单原理介绍,学完这门课你会对几个算法有个大致的了解。",
            "接着去听细致讲算法的课就不会那么一脸懵,而且能对机器学习的流程有一个比较清晰完整的认知。"]
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))

    # 1、实例化一个转换器
    transfer = CountVectorizer(stop_words=["一个", "一脸"])  # stop_words不指定特征词

    # 2、调用fit_transform():先学习(即“拟合”)字典中的键作为特征名,然后将 data 列表中的字典转换为 NumPy 数组
    data_final = transfer.fit_transform(data_new)

    print("出现的次数:", data_final.toarray())  # toarray()转换二维数组
    print("特征名字:", transfer.get_feature_names_out())

    return None


def cut_word(text):
    # jieba.cut()返回的是一个生成器,将其转换为列表,join将列表中的每个词语用空格连接起来
    return " ".join(list(jieba.cut(text)))


if __name__ == '__main__':
    count_chinese_dome()

TF-IDF TfidfVectorizer

# 通过计算词频(Term Frequency, TF)和逆文档频率(Inverse Document Frequency, IDF)的乘积来转换文本数据
from sklearn.feature_extraction.text import TfidfVectorizer


def tfidf_demo():
    data = ["lift is short, i like like python", "lift is too long, i dislike python"]

    # 实例化一个转换器
    transfer = TfidfVectorizer()  # 拟合和转换二维数组

    # 2、调用fit_transform():先学习(即“拟合”)字典中的键作为特征名,然后将 data 列表中的字典转换为 NumPy 数组
    data_new = transfer.fit_transform(data)

    print("数值越大说明该词更重要:\n", data_new.toarray())  # toarray()转换二维数组
    print("特征名字:", transfer.get_feature_names_out())


if __name__ == '__main__':
    tfidf_demo()

特征预处理

无量纲化
  • 定义:无量纲化是指通过某种数学变换,将原始数据转换为无量纲的数值,以便进行后续的数据分析和机器学习建模。

  • 目的:

    1. 消除不同量纲的影响,使得所有特征在数值上处于同一量级,便于算法处理。

    2. 提高模型的收敛速度和性能,防止某些特征因量纲过大或过小而对模型产生过大的影响。

归一化 MinMaxScaler

from sklearn.preprocessing import MinMaxScaler

  • 归一化是将原始数据线性变换到[0,1]区间(或其他指定区间)内。其公式为:xnor**m=xmaxxminxx**min,其中x**minxmax分别是样本的最小值和最大值。

  • 优点:简单易行,能够保持数据的原始分布形态,对于小数据集或需要保留稀疏矩阵特性的情况较为适用。

  • 缺点:当新数据加入时,最大值和最小值可能会发生变化,需要重新计算归一化参数。

# MinMaxScaler 将特征缩放到给定的最小值和最大值之间(默认:0~1)
from sklearn.preprocessing import MinMaxScaler
import pandas as pd


def min_max_scaler():
    data = pd.read_csv('./clean_day2.csv').loc[:1000, ["hightest_tem", "lowest_tem"]]
    # 1、实例化转换器
    transfer = MinMaxScaler(feature_range=(2, 3))  # 指定特征范围
    # 2、调用fit_transform():先学习(即“拟合”)字典中的键作为特征名,然后将 data 列表中的字典转换为 NumPy 数组
    data_new = transfer.fit_transform(data)
    print("统一规格(二维数组):\n", data_new)


if __name__ == '__main__':
    min_max_scaler()

标准化 StandardScaler

from sklearn.preprocessing import StandardScaler

  • 标准化是将特征值转换为均值为0,标准差为1的正态分布形式。其公式为:xnor**m=σ**xμ,其中x是原始数据,μ是样本均值,σ是样本标准差。

  • 优点:能够反映数据分布的离散程度,对于符合正态分布或数据量较大的情况更为有效。

  • 缺点:对异常值敏感,且会改变原始数据的分布结构,不适合稀疏数据。

# StandardScaler 所有特征的尺度一致,从而提高算法的收敛速度。
from sklearn.preprocessing import StandardScaler
import pandas as pd


def stand_demo():
    data = pd.read_csv('./clean_day2.csv').loc[:1000, ["hightest_tem", "lowest_tem"]]
    # 1、实例化转换器
    transfer = StandardScaler()
    # 2、调用fit_transform():先学习(即“拟合”)字典中的键作为特征名,然后将 data 列表中的字典转换为 NumPy 数组
    data_new = transfer.fit_transform(data)
    print("统一规格(二维数组):\n", data_new)


if __name__ == '__main__':
    stand_demo()

特征降维

特征选择

from sklearn.feature_selection import VarianceThreshold

低方差过滤 VarianceThreshold

# VarianceThreshold 删除低方差的一些特征
from sklearn.feature_selection import VarianceThreshold

import pandas as pd


def Variance_demo():
    data = pd.read_csv('./clean_day2.csv').loc[:1000, ["hightest_tem", "lowest_tem"]]
    # 1、实例化转换器
    transfer = VarianceThreshold(threshold=5)  # 特征(列)的方差如果低于5,该特征将在转换过程中被移除
    # 2、调用fit_transform():先学习(即“拟合”)字典中的键作为特征名,然后将 data 列表中的字典转换为 NumPy 数组
    data_new = transfer.fit_transform(data)
    print("统一规格(二维数组):\n", data_new, data_new.shape)


if __name__ == '__main__':
    Variance_demo()

相关系数 pearsonr

特征与特征之间的相关程度

from scipy.stats import pearsonr

# 计算两个变量之间的皮尔逊相关系数(介于-1和1之间:越大相关性越强)
from scipy.stats import pearsonr

import pandas as pd


def pearsonr_demo():
    data = pd.read_csv('./clean_day2.csv').loc[:1000, ["hightest_tem", "lowest_tem"]]
    print("相关系数:\n", pearsonr(data["hightest_tem"], data["lowest_tem"]))


if __name__ == '__main__':
    pearsonr_demo()

主成分分析 PCA

from sklearn.decomposition import PCA

# PCA通过正交变换将可能相关的变量转换为一组线性不相关的变量
from sklearn.decomposition import PCA


def pca_demo():
    data = [[26, 39, 48, 57], [16, 25, 33, 41], [13, 22, 34, 24], [41, 25, 43, 40]]
    # 1、实例化转换器
    transfer = PCA(2)  # 保留 2 个主成分
    # 2、调用fit_transform():先学习数据的主成分,然后将数据转换到这些主成分构成的新空间中
    data_new = transfer.fit_transform(data)
    print("二维数组:\n", data_new, data_new.shape)


if __name__ == '__main__':
    pca_demo()

分类算法

估计器 estumator

  1. 实例化一个estimator

  2. estimator.fit(x_train, y_train) 计算--模型生成

  3. 模型评估:

    1. 直接比对真实值和预测值

      y_priedict = estimator.predict(x_test)
      y_test == y_predict
    2. 计算准确度

      score = estimator.score(x_test, y_test)

K-近邻算法(KNN)

分类任务KNeighborsClassifier

  • 预测一个离散的类别标签。

  • 例如,根据邮件内容判断是否为垃圾邮件、根据图像特征判断图像中的物体类别等。

# 用于实现K近邻分类
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 用于特征缩放,即将特征值缩放到均值为0,标准差为1的分布中
from sklearn.preprocessing import StandardScaler
# 网格搜索与验证
from sklearn.model_selection import GridSearchCV


def knn_iris():
    # 1、获取数据
    iris = load_iris()

    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=22)

    # 3、特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4、KNN算法预估器
    estimator = KNeighborsClassifier()
    # 加入网格搜索与交叉验证
    # 参数准备(需找合适的邻近k值)
    param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)  # cv使数据更精确:常用10
    estimator.fit(x_train, y_train)

    # 5、模型评估
    # 方法1、直接对比真实值和预测值
    y_pred = estimator.predict(x_test)
    print(y_pred)
    print("直接对比真实值和预测值:", y_test == y_pred)

    # 方法2、计算准确度
    score = estimator.score(x_test, y_test)
    print("计算准确度:", score)

    # 最佳参数
    print("最佳参数:", estimator.best_params_)
    # 最佳结果
    print("最佳结果:", estimator.best_score_)
    # 最佳估计器
    print("最佳估计器:", estimator.best_estimator_)
    # 交叉验证结果
    print("交叉验证结果:", estimator.cv_results_)


if __name__ == '__main__':
    knn_iris()

回归任务KNeighborsRegressor

  • 预测一个连续的数值。

  • 例如,预测房价、股票价格或气温等。

模型选择与调优API

交叉验证 GridSearchCV

# 用于实现K近邻分类
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 用于特征缩放,即将特征值缩放到均值为0,标准差为1的分布中
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV


def knn_iris():
    # 1、获取数据
    iris = load_iris()

    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=22)

    # 3、特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4、KNN算法预估器
    estimator = KNeighborsClassifier()
    # 加入网格搜索与交叉验证
    # 参数准备
    param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
    estimator.fit(x_train, y_train)

    # 5、模型评估
    # 方法1、直接对比真实值和预测值
    y_pred = estimator.predict(x_test)
    print(y_pred)
    print("直接对比真实值和预测值:", y_test == y_pred)

    # 方法2、计算准确度
    score = estimator.score(x_test, y_test)
    print("计算准确度:", score)

    # 最佳参数
    print("最佳参数:", estimator.best_params_)
    # 最佳结果
    print("最佳结果:", estimator.best_score_)
    # 最佳估计器
    print("最佳估计器:", estimator.best_estimator_)
    # 交叉验证结果
    print("交叉验证结果:", estimator.cv_results_)


if __name__ == '__main__':
    knn_iris()

朴素贝叶斯算法 fetch_20newsgroups

# 新闻数据集
from sklearn.datasets import fetch_20newsgroups
# 导入朴素贝叶斯算法
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer


def nb_news():
    # 获取数据
    news = fetch_20newsgroups(subset='all')

    # 划分数据集
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)

    # 特征提取:文本特征提取:tfidf
    transfer = TfidfVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 朴素贝叶斯算法预估器
    estimator = MultinomialNB()
    estimator.fit(x_train, y_train)

    # 模型评估
    # 方法1、直接对比真实值和预测值
    y_pred = estimator.predict(x_test)
    print(y_pred)
    print("直接对比真实值和预测值:", y_test == y_pred)

    # 方法2、计算准确度
    score = estimator.score(x_test, y_test)
    print("计算准确度:", score)


if __name__ == '__main__':
    nb_news()

决策树 DecisionTreeClassifier

作用:高效进行决策

优点:可解释能力强

缺点:容易产生过拟合

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# 导入决策树模块和可视化决策树模块
from sklearn.tree import DecisionTreeClassifier, export_graphviz


def tree_iris():
    # 1、获取数据集
    iris = load_iris()
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
    # 3、决策树预估器
    estimator = DecisionTreeClassifier()
    estimator.fit(x_train, y_train)
    # 4、模型评估
    # 方法1、直接对比真实值和预测值
    y_pred = estimator.predict(x_test)
    print(y_pred)
    print("直接对比真实值和预测值:", y_test == y_pred)

    # 方法2、计算准确度
    score = estimator.score(x_test, y_test)
    print("计算准确度:", score)
    
    # 5、可视化决策树
    export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)




if __name__ == '__main__':
    tree_iris()

随机森林预测 RandomForestClassifier

优点:极好准确率,处理具有高维持特征的输入样本,不需要降维

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV


def random_forest():
    # 1、获取数据集
    iris = load_iris()
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
    # 3、决策树预估器
    estimator = RandomForestClassifier()
    # 加入网格搜索与交叉验证
    # 参数准备(需找合适的邻近k值)
    param_dict = {"n_estimators": [120, 200, 300, 500, 800, 1200]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)  # cv使数据更精确:常用10
    estimator.fit(x_train, y_train)
    # 4、模型评估
    # 方法1、直接对比真实值和预测值
    y_pred = estimator.predict(x_test)
    print(y_pred)
    print("直接对比真实值和预测值:", y_test == y_pred)

    # 方法2、计算准确度
    score = estimator.score(x_test, y_test)
    print("计算准确度:", score)

    # 最佳参数
    print("最佳参数:", estimator.best_params_)
    # 最佳结果
    print("最佳结果:", estimator.best_score_)
    # 最佳估计器
    print("最佳估计器:", estimator.best_estimator_)
    # 交叉验证结果
    print("交叉验证结果:", estimator.cv_results_)


if __name__ == '__main__':
    random_forest()

回归与聚类算法

线性回归

  • 线性关系一定是线性模型

  • 线性模型不一定是线性关系

优化方法:

  1. 正规方程(小规模数据):不能解决拟合问题

  2. 梯度下降(大规模数据)

  3. 回归性能评估:均方误差

# 导入正规方程和梯度下降
from sklearn.linear_model import LinearRegression, SGDRegressor

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
from sklearn.preprocessing import StandardScaler
# 导入回归性能评估:均方误差
from sklearn.metrics import mean_squared_error


def linear_1():
    """
    正规方程
    :return:
    """
    # 1、获取数据集
    diabetes = load_diabetes()
    print("特征数量:", diabetes.data.shape[1])
    # 2、数据集划分
    x_train, x_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, random_state=22)
    # 3、特征工程-标准化
    transfer = StandardScaler()
    t_train = transfer.fit_transform(x_train)
    t_test = transfer.transform(x_test)
    # 4、预估器
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)
    # 5、得出模型
    print("正规方程权重系数:", estimator.coef_)
    print("正规方程偏置为:", estimator.intercept_)
    # 6、模型评估
    y_pred = estimator.predict(x_test)
    print("预测:\n", y_pred)
    error = mean_squared_error(y_test, y_pred)
    print("正规方程-均方误差为:\n", error)



def linear_2():
    """
    梯度下降
    :return:
    """
    print("*"*100)
    # 1、获取数据集
    diabetes = load_diabetes()
    print("特征数量:", diabetes.data.shape[1])
    # 2、数据集划分
    x_train, x_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, random_state=22)
    # 3、特征工程-标准化
    transfer = StandardScaler()
    t_train = transfer.fit_transform(x_train)
    t_test = transfer.transform(x_test)
    # 4、预估器
    estimator = SGDRegressor(learning_rate="constant", eta0=0.01, max_iter=10000)  # 增加 max_iter 以改善拟合,帮助算法更好地收敛.
    estimator.fit(x_train, y_train)
    # 5、得出模型
    print("梯度下降权重系数:", estimator.coef_)
    print("梯度下降偏置为:", estimator.intercept_)
    # 6、模型评估
    y_pred = estimator.predict(x_test)
    print("预测:\n", y_pred)
    error = mean_squared_error(y_test, y_pred)
    print("梯度下降-均方误差为:\n", error)


if __name__ == '__main__':
    linear_1()
    linear_2()

欠拟合与过拟合

  • 欠拟合

  • 过拟合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值