机器学习基础课程-5-课程实验
5.1 实验介绍
实验背景
在这个项目中,您将使用1994年美国人口普查收集的数据,选用几个监督学习算法以准确地建模被调查者的收入。然后,您将根据初步结果从中选择出最佳的候选算法,并进一步优化该算法以最好地建模这些数据。你的目标是建立一个能够准确地预测被调查者年收入是否超过50000美元的模型。这种类型的任务会出现在那些依赖于捐款而存在的非营利性组织。了解人群的收入情况可以帮助一个非营利性的机构更好地了解他们要多大的捐赠,或是否他们应该接触这些人。虽然我们很难直接从公开的资源中推断出一个人的一般收入阶层,但是我们可以(也正是我们将要做的)从其他的一些公开的可获得的资源中获得一些特征从而推断出该值。
这个项目的数据集来自UCI机器学习知识库。这个数据集是由Ron Kohavi和Barry Becker在发表文章"Scale Up the Accuracy of Naive-Bayes Classifiers: A Decision-Tree Hybrid"之后捐赠的,你可以在Ron Kohavi提供的在线版本中找到这个文章。我们在这里探索的数据集相比于原有的数据集有一些小小的改变,比如说移除了特征 以及一些遗失的或者是格式不正确的记录。'fnlwgt'
5.2 数据探索
导入数据
运行下面的代码单元以载入需要的Python库并导入人口普查数据。
注意数据集的最后一列 将是我们需要预测的列(表示被调查者的年收入会大于或者是最多50,000美元),人口普查数据中的每一列都将是关于被调查者的特征。'income'
#
引入此项目需要的库
import numpy as np
import pandas as pd
from time import time
import matplotlib as mpl
#
使用
display()
显示
DataFrame
from IPython.display import display
#
引入可视化代码
visuals.py
import visuals as vs
#
让可视化更方便更美观
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
#
设置
matplotlib
中文显示
mpl.rcParams['font.family'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
#
载入人口普查数据
try:
data = pd.read_csv('census.csv')
print('
数据集有
{}
个样本,每个样本有
{}
个特征。
'.format(
*data.shape))
display(data.head())
except:
print('
数据集无法加载,数据集丢失了吗?
')
数据集有 45222 个样本,每个样本有 14 个特征
特征
- age: 一个整数,表示被调查者的年龄。
- workclass: 一个类别变量表示被调查者的通常劳动类型,允许的值有 {Private, Self-emp-not-inc, Self-emp-inc, Federal-gov, Local-gov, State-gov, Without-pay, Never-work}
- education_level: 一个类别变量表示教育程度,允许的值有 {Bachelors, Some-college, 11th, HS-grad, Prof-school, Assoc-acdm, Assoc-voc, 9th, 7th-8th, 12th, Masters, 1st-4th, 10th, Doctorate, 5th-6th, Preschool}
- education-num: 一个整数表示在学校学习了多少年
- 婚姻状态: 一个类别变量,允许的值有 {已婚-公民-配偶, 离婚, 从未结婚, 分居, 寡居, 已婚-配偶-缺席, 已婚-AF-配偶}
- 职业: 一个类别变量表示一般的职业领域,允许的值有 {Tech-support, Craft-repair, Other-service, Sales, Exec-Managemential, Prof-specialty, Handlers-cleaners, Machine-op-inspct, Adm-clerical, Farming-fishing , Transport-move, Priv-house-serv, Protective-serv, Armed Forces}
- relationship: 一个类别变量表示家庭情况,允许的值有
- race: 一个类别变量表示人种,允许的值有 {White, Asia-Pac-Islander, Amer-Indian-Eskimo, Other, Black}
- :一个类别变量表示性别,允许的值有 { Female , Male }
- 资本收益:连续值。
- 资本损失: 连续值。
- 小时/周: 连续值。
- native-country: 一个类别变量表示原始的国家,允许的值有 {美国, 柬埔寨, 英国, 波多黎各, 加拿大, 德国, Outlying-US(关岛-USVI-etc), 印度, 日本, 希腊, 南部, 中国, 古巴, 伊朗, 洪都拉斯, 菲律宾, 意大利, 波兰, 牙买加, 越南, 墨西哥, 葡萄牙, 爱尔兰, 法国, 多米尼加共和国, 老挝, 厄瓜多尔, 台湾, 海地, 哥伦比亚, 匈牙利, 危地马拉, 尼加拉瓜, 苏格兰, 泰国, 南斯拉夫, 萨尔瓦多, 特里纳达德和多巴哥, 秘鲁, 洪, 荷兰荷兰}
数据探索
首先我们对数据集进行一个粗略的探索,我们将看看每一个类别里会有多少被调查者?并且告诉我们这些里面多大比例是年收入大于 50,000 美元的。在下面的代码单元中,你将需要计算以下量:
- 总的记录数量,
'n_records'
- 年收入大于50,000美元的人数,.
'n_greater_50k'
- 年收入最多为50,000美元的人数 .
'n_at_most_50k'
- 年收入大于50,000美元的人所占的比例, .
'greater_percent'
**提示:**您可能需要查看上面的生成的表,以了解 条目的格式是什么样的。'income'
# TODO:
总记录数
n_records = len(data.index)
# TODO:
个人收入超过
50,000
美元
n_greater_50k = len(data[data['income'] != '<=50K'].index)
# TODO:
个人最多可获得
50,000
美元
n_at_most_50k = len(data[data['income'] == '<=50K'].index)
# TODO:
个人收入超过
5
万美元的百分比
greater_percent = float(n_greater_50k) / n_records * 100
#
输出结果
print('
总记录数:
{}'.format(n_records))
print('
个人收入超过
50,000
美元:
{}'.format(n_greater_50k))
print('
个人最多可获得
50,000
美元:
{}'.format(n_at_most_50k))
print('
个人收入超过
5
万美元的百分比:
{:.2f}
%
'.format(greater_percent))
总记录数:45222
个人收入超过50,000美元:11208
个人最多可获得50,000美元:34014
个人收入超过5万美元的百分比:24.78%
5.3 数据预处理
准备数据
在数据能够被作为输入提供给机器学习算法之前,它经常需要被清洗、格式化和重新组织 - 这通常被叫做预处理。
幸运的是,对于这个数据集,没有我们必须处理的无效或丢失的条目,然而,由于某一些特征存在的特性我们必须进行一定的调整。这个预处理都可以极大地帮助我们提升几乎所有的学习算法的结果和预测能力。
display(data.dtypes)
data.describe()
import seaborn as sns
display(data.select_dtypes(include=['int64','float64']).columns)
sns.pairplot(data.select_dtypes(include=['int64','float64']),diag_kind='kde')
转换倾斜的连续特征
一个数据集有时可能包含至少一个靠近某个数字的特征,但有时也会有一些相对来说存在极大值或者极小值的不平凡分布的的特征。算法对这种分布的数据会十分敏感,并且如果这种数据没有能够很好地归一化处理会使得算法表现不佳。
在人口普查数据集的两个特征符合这个描述: 和 。'capital-gain''capital-loss'
运行下面的代码单元以创建一个关于这两个特征的条形图。请注意当前的值的范围和它们是如何分布的。
# 将数据切分成特征和对应的标签
income_raw = data['income']
features_raw = data.drop('income', axis = 1)
# 可视化原来数据的倾斜的连续特征
vs.distribution(data)
# TODO: 用 MatplotLib 和 Seaborn 实现可视化
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10,5))
plt.subplot(121)
sns.distplot(data['capital-gain'])
plt.subplot(122)
sns.distplot(data['capital-loss'])
对于高度倾斜分布的特征如和,常见的做法是对数据施加一个对数转换,将数据转换成对数,这样非常大和非常小的值不会对学习算法产生负面的影响。并且使用对数变换显著降低了由于异常值所造成的数据范围异常。'capital-gain''capital-loss'
但是在应用这个变换时必须小心:因为0的对数是没有定义的,所以我们必须先将数据处理成一个比0稍微大一点的数以成功完成对数转换。
运行下面的代码单元来执行数据的转换和可视化结果。再次,注意值的范围和它们是如何分布的。
# 对于倾斜的数据使用 np.log() 函数转换
skewed = ['capital-gain', 'capital-loss']
features_log_transformed = pd.DataFrame(data = features_raw)
features_log_transformed[skewed] = features_raw[skewed].apply(lambda x: np.log(x + 1))
# 可视化对数转换后的数据分布
vs.distribution(features_log_transformed, transformed=True)
plt.figure(figsize=(10,5))
plt.subplot(121)
sns.distplot(features_log_transformed['capital-gain'])
plt.subplot(122)
sns.distplot(features_log_transformed['capital-loss'])
归一化数字特征
除了对于高度倾斜的特征施加转换,对数值特征施加一些形式的缩放通常会是一个好的习惯。
在数据上面施加一个缩放并不会改变数据分布的形式(比如上面说的 或 );但是归一化保证了每一个特征在使用监督学习器的时候能够被平等的对待。'capital-gain''capital-loss'
注意一旦使用了缩放,观察数据的原始形式不再具有它本来的意义了,就像下面的例子展示的。
运行下面的代码单元来规一化每一个数字特征。我们将使用sklearn.preprocessing.MinMaxScaler来完成这个任务。
# 引入 sklearn.preprocessing 的 MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
# 初始化一个 scaler,然后将其应用于特征
scaler = MinMaxScaler()
numerical = ['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week']
features_log_minmax_transform = pd.DataFrame(data = features_log_transformed)
features_log_minmax_transform[numerical] = scaler.fit_transform(features_log_transformed[numerical])
# 显示应用了 scaler 的样本示例
display(features_log_minmax_transform.head(n = 5))
for key in numerical:
sns.distplot(features_log_transformed[key])
plt.show()
数据预处理
从上面的数据探索中的表中,我们可以看到有几个属性的每一条记录都是非数字的。通常情况下,学习算法期望输入是数字的,这要求非数字的特征(称为类别变量)被转换。转换类别变量的一种流行的方法是使用独热编码 (One-Hot编码)方案。
独热编码为每一个非数字特征的每一个可能的类别创建一个"虚拟"变量。例如,假设 有三个可能的取值 , 或者 。我们将把这个特征编码成 , 和 。someFeatureABCsomeFeature_AsomeFeature_BsomeFeature_C
特征 | 特征_A | 特征_B | 特征_C | ||
0 | B | 0 | 1 | 0 | |
1 | C | –>一热编码 --> | 0 | 0 | 1 |
2 | 一个 | 1 | 0 | 0 |
此外,对于非数字的特征,我们需要将非数字的标签 转换成数值以保证学习算法能够正常工作。因为这个标签只有两种可能的类别("<=50K" 和 ">50K"),我们不必要使用独热编码,可以直接将他们编码分别成两个类 和 ,在下面的代码单元中你将实现以下功能:'income'01
- 使用pandas.get_dummies()对 数据进行独热编码'features_raw'
- 将目标标签 转换成数字'income_raw'
-
- 将 "<=50K" 转换成0
- 将 ">50K" 转换成1
# TODO: 使用 pandas.get_dummies() 对 'features_log_minmax_transform' 数据进行独热编码
feature_object = features_log_minmax_transform.select_dtypes(include=['object'])
features_log_minmax_transform[feature_object.columns] = feature_object.apply(
lambda x: x.str.strip())
features_final = pd.get_dummies(features_log_minmax_transform)
# TODO: 将 'income_raw' 编码成为数字
income = (income_raw == '>50K').astype(np.uint8)
# 输出经过独热编码之后的特征数量
encoded = list(features_final.columns)
print('独热编码之后共有 {} 个全部特征'.format(len(encoded)))
# 移除下面一行的注释以观察编码后的特征名称
print(encoded)
独热编码之后共有 103 个
全部特征 ['age', 'education-num', 'capital-gain', 'capital-loss', '每周小时数', 'workclass_Federal-gov', 'workclass_Local-gov', 'workclass_Private', 'workclass_Self-emp-inc', 'workclass_Self workclass_State-nmp-inc', 'workclass_State-gov', 'workclass_Without-pay', 'education_level_10th', 'education_level_11th', 'education_level_12th', 'education_level_1st-4th', 'education_level_5th-6th', 'education_level_7th-8th', 'education_level_9th', 'education_level_Assoc-acdm', 'education_level_Assoc-voc', 'education_level_Bachelors', 'education_level_Doctorate', 'education_level_HS-grad', 'education_level_Masters', 'education_level_Preschool', 'education_level_Prof-school', 'education_level_Some-College', 'marital-status_Divorced', 'marital-status_Married-AF-配偶', '婚姻-status_Married-civ-配偶', '婚姻-status_Married-配偶-缺席', '婚姻-status_Never-已婚', '婚姻-status_Separated', '婚姻-status_丧偶"、"occupation_Adm文职人员"、"occupation_Armed部队"、"occupation_Craft修理"、"occupation_Exec管理"、"occupation_Farming捕鱼"、"occupation_Handlers清洁工"、"occupation_Machine行动者"、"occupation_Other服务"、"occupation_Priv服务"、"occupation_Prof专业"、"occupation_Protective服务"、"occupation_Sales"、"occupation_Tech支持"、"occupation_Transport移动"、"relationship_Husband"、"家庭relationship_Not"、"家庭relationship_Not"、""relationship _ Other 亲戚、 relationship _ Own 儿童、 relationship _ Unmarried 、 relationship _ Wife 、 race _ Amer - 印度 - 爱斯基摩人、 race _ Asian - 太平洋岛民、 race _ Black 、 race _ Other 、 race _ White 、 _ Female 、 _ Male 、本土 country _ Cambodia 、本土 country _ Canada 、本土 country _ China 、本土 country _ Columbia 、本土 country _ Cuba 、本土 country _ Dominican 共和国、本土 country _ Ecuador 、本土 country _ El 萨尔瓦多、本土 country _ England 、"本地-country_France"、"本地-country_Germany"、"本地-country_Greece"、"本地-country_Guatemala"、"本地-country_Haiti"、"本地-country_Holand-荷兰"、"本地-country_Honduras"、"本地-country_Hong"、"本地-country_Hungary"、"本地-country_India"、"本地-country_Iran"、"本地-country_Ireland"、"本地-country_Italy"、"本地-country_Jamaica"、"本地-country_Japan"、"本地-country_Laos"、"本地-country_Mexico"、"本地-country_Nicaragua', "本地country_Outlying-美国(关岛-USVI-等)"、"本地country_Peru"、"本地country_Philippines"、"本地country_Poland"、"本地country_Portugal"、"本地country_Puerto-Rico"、"本地country_Scotland"、"本地country_South"、"本地country_Taiwan"、"本地country_Thailand"、"本地country_Trinadad和多巴哥"、"本地country_United国"、"本地国家_越南"、"本地country_Yugoslavia"]
混洗和切分数据
现在所有的类别变量已被转换成数值特征,而且所有的数值特征已被规一化。和我们一般情况下做的一样,我们现在将数据(包括特征和它们的标签)切分成训练和测试集。其中 80% 的数据将用于训练和 20% 的数据用于测试。
运行下面的代码单元来完成切分。
# 引入 sklearn.model_selection 的 train_test_split
from sklearn.model_selection import train_test_split
# 将 'features' 和 'income' 数据切分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
features_final,income,test_size=0.2,random_state=0)
# 显示切分的结果
print('训练集有 {} 个样本。'.format(X_train.shape[0]))
print('测试集有 {} 个样本。'.format(X_test.shape[0]))
训练集有 36177 个样本。
测试集有 9045 个样本。
5.4 评价模型性能
在这一部分中,我们将尝试四种不同的算法,并确定哪一个能够最好地建模数据。
这里面的三个将是你选择的监督学习器,而第四种算法被称为一个朴素的预测器。
评价方法和朴素的预测器
UdacityML通过他们的研究人员知道被调查者的年收入大于 $50,000 最有可能向他们捐款。因为这个原因UdacityML对于准确预测谁能够获得 $50,000 以上收入尤其有兴趣。这样看起来使用准确率作为评价模型的标准是合适的。
另外,把没有收入大于 $50,000 的人识别成年收入大于 $50,000 对于UdacityML来说是有害的,因为他想要找到的是有意愿捐款的用户。
这样,我们期望的模型具有准确预测那些能够年收入大于 $50,000 的能力比模型去召回这些被调查者更重要。我们能够使用F-beta score作为评价指标,这样能够同时考虑准确率和召回率:
F_{\beta}=(1+\beta^2)\cdot\frac{precision\ \cdot\ recall}{\left(\beta^2\ \cdot\ precision\right)+recall}Fβ=(1+β2)⋅(β2 ⋅precision )+recallprecision⋅recall
尤其是,当\beta =0.5β=0.5 个的时候跟多的强调准确率,这叫做F_{0.5}0.5 个得分(或者为了简单叫做 F-score)。
通过查看不同类别的数据分布(那些最多赚 $50,000 和那些能够赚更多的),我们能发现:很明显的是很多的被调查者年收入没有超过 $50,000。这点会显著地影响准确率,因为我们可以简单地预测说"这个人的收入没有超过$50,000",这样我们甚至不用看数据就能做到我们的预测在一般情况下是正确的!
做这样一个预测被称作是朴素的,因为我们没有任何信息去证实这种说法。通常考虑对你的数据使用一个朴素的预测器是十分重要的,这样能够帮助我们建立一个模型的表现是否好的基准。那有人说,使用这样一个预测是没有意义的:如果我们预测所有人的收入都低于 $50,000,那么UdacityML就不会有人捐款了。
注意: 准确、精密 和 召回 概要
准确度 (accuracy)衡量分类器进行正确预测的频率。它是正确预测数量与预测总数(测试数据点数量)的比率。
精确度 (precision)告诉我们,我们将哪些邮件归类为垃圾邮件,实际上是垃圾邮件。这是一个真正的肯定比例(被分类为垃圾邮件,实际上是垃圾邮件)与所有正面比率(所有被归类为垃圾邮件,无论这是否正确的分类)。
换句话说:[ 真实肯定 / ( 真实肯定 + 错误肯定) ]
召回度(敏感度) (recall)告诉我们实际上垃圾邮件的比例是由我们分类为垃圾邮件。这是真正的肯定比例(被分类为垃圾邮件,实际上是垃圾邮件)与所有实际上是垃圾邮件的比率。
换句话说:[ 真正肯定 / (真正肯定 + 错误否定)]
对于像我们这样的分类分布有偏差的分类问题,例如,如果我们有100条短信,只有2条是垃圾信息,其余98条不是,则准确度本身并不是一个很好的指标。
我们可以将90封邮件归类为非垃圾邮件(包括2封垃圾邮件,但我们将其归类为非垃圾邮件,因此它们将是错误的否定信息),10封为垃圾邮件(全部10个误报),仍然得到相当好的准确性分数。
对于这种情况,精确度和召回率非常方便。这两个指标可以合并得到F_1F1分数,这是精度和召回分数的加权平均值(调和平均值)。这个分数可以从0到1,其中1是最好的F_1F1分数(当我们处理比率时,我们采用调和平均值)。
朴素预测器的性能
如果我们选择一个无论什么情况都预测被调查者年收入大于 $50,000 的模型,那么这个模型在这个数据集上的准确率和F-score是多少?
**注意:**你必须使用下面的代码单元将你的计算结果赋值给 和 ,这些值会在后面被使用,请注意这里不能使用scikit-learn,你需要根据公式自己实现相关计算。'accuracy''fscore'
# TODO:
计算准确率
accuracy = income.mean()
# TODO:
使用上面的公式,并设置
`beta=0.5`
计算
F-score
prediction = np.ones(len(income))
beta2 = 0.5 ** 2
recall = 1
precision = accuracy
fscore = (1 + beta2) * precision * recall / (beta2 * precision + recall)
#
输出结果
print('
朴素预测器得分:
[
准确度
: {:.4f}
,
F-score: {:.4f}]'.format(
accuracy, fscore))
朴素预测器得分:
[
准确度
: 0.2478
,
F-score: 0.2917]
5.5 监督学习模型
下面的监督学习模型是现在在scikit-learn中你能够选择的模型
- 朴素贝叶斯 (GaussianNB)
- 决策树
- 集成方法 (Bagging, AdaBoost, Random Forest, Gradient Boosting)
- K近邻 (KNeighbors)
- 随机梯度下降分类器 (SGDC)
- 支撑向量机 (SVM)
- 物流回归
创建一个训练和预测的管道
为了正确评估你选择的每一个模型的性能,创建一个能够帮助你快速有效地使用不同大小的训练集并在测试集上做预测的训练和测试的流水线是十分重要的。
你在这里实现的功能将会在接下来的部分中被用到。在下面的代码单元中,你将实现以下功能:
- 从sklearn.metrics中导入 和fbeta_scoreaccuracy_score
- 用样例训练集拟合学习器,并记录训练时间
- 用学习器来对训练集进行预测并记录预测时间
- 在最前面的 500 个训练数据上做预测
- 计算训练数据和测试数据的准确率
- 计算训练数据和测试数据的 F-score
# TODO: 从 sklearn.metrics 中导入 fbeta_score 和 accuracy_score
from sklearn.metrics import fbeta_score, accuracy_score
def train_predict(learner, sample_size, X_train, y_train, X_test, y_test):
'''
输入:
- learner: 要训练和预测的机器学习算法
- sample_size: 从训练集中抽取的样本(数量)的大小
- X_train: 特征训练集
- y_train: 目标培训集
- X_test: 特征测试集
- y_test: 目标测试集
'''
results = {}
# TODO: 使用 sample_size 大小的训练数据来拟合 learner
start = time() # 获取开始时间
learn = learner.fit(X_train[:sample_size], y_train[:sample_size])
end = time() # 获取结束时间
# TODO: 计算训练时间
results['train_time'] = end - start
# TODO: 获得测试集 (X_test) 的预测结果,
# 然后使用 .predict() 获得前300个训练样本 (X_train) 的预测值。
start = time() # 获取开始时间
predictions_test = learner.predict(X_test)
predictions_train = learner.predict(X_train[:300])
end = time() # 获取结束时间
# TODO: 计算预测用时
results['pred_time'] = end - start
# TODO: 计算前300个训练样本的准确率
results['acc_train'] = accuracy_score(y_train[:300], predictions_train)
# TODO: 计算测试集的准确率
results['acc_test'] = accuracy_score(y_test, predictions_test)
# TODO: 计算前300个训练样本的准确率
results['f_train'] = fbeta_score(y_train[:300], predictions_train, 0.5)
# TODO: 计算测试集的F-score
results['f_test'] = fbeta_score(y_test, predictions_test, 0.5)
# 成功
print(' {} 对 {} 个样本进行了训练。'.format(
learner.__class__.__name__, sample_size))
# 返回结果
return results
初始模型的评估
在下面的代码单元中,您将需要实现以下功能:
- 导入你在前面的讨论的三个监督学习模型。
- 初始化三模型并存储在 , 和 中。'clf_A''clf_B''clf_C'
-
- 如果可能对每一个模型都设置一个 。random_state
- **注意:**这里先使用每一个模型的默认参数,在接下来的部分中你将需要对某一个模型的参数进行调整。
- 计算记录的数目等于 1%,10% 和 100% 的训练数据,并将这些值存储在 中'samples'
**注意:**取决于你选择的算法,下面实现的代码可能需要一些时间来运行!
# TODO: 从 sklearn 中导入三个监督学习模型
# 下面是所有算法的示例
# 1. 朴素贝叶斯 (GaussianNB)
# 2. 决策树
# 3. 集成方法 (AdaBoost)
# 4. 集成方法 (Random Forest)
# 5. 集成方法 (Gradient Boosting)
# 6. K近邻 (KNeighbors)
# 7. 随机梯度下降分类器 (SGDC)
# 8. 支撑向量机 (SVM)
# 9. Logistic回归
# 10. XGBClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import SGDClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
# TODO: 初始化三个模型
clf_A = GaussianNB()
clf_B = DecisionTreeClassifier(random_state=42)
clf_C = AdaBoostClassifier(random_state=42)
clf_D = RandomForestClassifier(random_state=42)
clf_E = GradientBoostingClassifier(random_state=42)
clf_F = KNeighborsClassifier()
clf_G = SGDClassifier(max_iter=1000, tol=1e-3,random_state=42)
clf_H = SVC(random_state=42)
clf_I = LogisticRegression(random_state=42)
# TODO: 计算 1%,10%,100% 的训练数据分别对应多少个数据点
samples_1 = int(0.01*len(X_train))
samples_10 = int(0.1*len(X_train))
samples_100 = len(X_train)
# 收集学习器的结果
results = {}
for clf in [clf_D, clf_C, clf_E]: #[clf_A, clf_B, clf_C, clf_D, clf_E, clf_F, clf_G, clf_H, clf_I, clf_J]:
clf_name = clf.__class__.__name__
results[clf_name] = {}
for i, samples in enumerate([samples_1, samples_10, samples_100]):
results[clf_name][i] = train_predict(
clf, samples, X_train, y_train, X_test, y_test)
# 对选择的三个模型得到的评价结果进行可视化
vs.evaluate(results, accuracy, fscore)
RandomForestClassifier 对 361 个样本进行了训练。
RandomForestClassifier 对 3617 个样本进行了训练。
RandomForestClassifier 对 36177 个样本进行了训练。
AdaBoostClassifier 对 361 个样本进行了训练。
AdaBoostClassifier 对 3617 个样本进行了训练。
AdaBoostClassifier 对 36177 个样本进行了训练。
GradientBoostingClassifier 对 361 个样本进行了训练。
GradientBoostingClassifier 对 3617 个样本进行了训练。
GradientBoostingClassifier 对 36177 个样本进行了训练。
提高效果
在这最后一节中,您将从三个有监督的学习模型中选择 最好的模型来使用数据。
你将在整个训练集( 和 )上通过使用网格搜索优化至少调节一个参数以获得一个比没有调节之前更好的 F-score。X_trainy_train
模型调优
调节选择的模型的参数。使用网格搜索 来至少调整模型的重要参数(至少调整一个),这个参数至少需给出并尝试3个不同的值。你要使用整个训练集来完成这个过程。在接下来的代码单元中,你需要实现以下功能:'GridSearchCV'
- 导入sklearn.grid_search.gridSearchCV和sklearn.metrics.make_scorer
- 初始化你选择的分类器,并将其存储在 中。clf
-
- 如果能够设置的话,设置random_state
- 创建一个对于这个模型你希望调整参数的字典。
-
- 例如: 。parameters = {'parameter' : [list of values]}
- **注意:**如果你的学习器(学习者)有 参数,请不要调节它!max_features
- 使用 来创建一个 评分对象(设置make_scorerfbeta_score\beta =0.5β=0.5 个)。
- 在分类器 上用 作为评价函数运行网格搜索,并将结果存储在 中。clf'scorer'grid_obj
- 用训练集(, )训练 ,并将结果存储在 中。X_trainy_traingrid_objgrid_fit
**注意:**取决于你选择的参数列表,下面实现的代码可能需要花一些时间运行!
# TODO: 导入 GridSearchCV, make_scorer
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score
from sklearn.metrics import fbeta_score
from sklearn.metrics import make_scorer
# TODO: 初始化分类器
clf_lr = LogisticRegression(random_state=42)
clf_ada = AdaBoostClassifier(random_state=42)
clf_gb = GradientBoostingClassifier(random_state=42)
# TODO: 创建您希望调优的参数列表
# LogisticRegression 参数列表
solver_lr = 'newton-cg liblinear'.split()
c_lr = np.logspace(-2,1,4)
param_grid_lr = dict(
solver=solver_lr,
C=c_lr
)
# AdaBoostClassifier 参数列表
n_estimators_ada = range(150,180,10)
learning_rate_ada = [x/10 for x in range(13,16)]
param_grid_ada = dict(
n_estimators=n_estimators_ada,
learning_rate=learning_rate_ada
)
# GradientBoostingClassifier 参数列表
max_depth_gb = range(5,8)
learning_rate_gb = np.logspace(-2,0,3)
n_estimators_gb = range(120,150,10)
param_grid_gb = dict(
n_estimators=n_estimators_gb,
learning_rate=learning_rate_gb,
max_depth=max_depth_gb
)
# TODO: 创建一个 fbeta_score 打分对象
scorer = make_scorer(fbeta_score)
# TODO: 在分类上使用网格搜索,使用 scorer 作为评价函数
# 使用 LogisticRegression 分类器
# grid_obj = GridSearchCV(clf_lr,param_grid_lr)
# 未优化的模型
# ------
# 测试数据的准确性评分:0.8630
# 测试数据的F得分:0.7395
# 使用 AdaBoostClassifier 分类器
grid_obj = GridSearchCV(clf_ada,param_grid_ada)
# 优化模型
# ------
# 测试数据的最终准确度分数:0.8649
# 测试数据的最终F得分:0.7398
# 使用 GradientBoostingClassifier 分类器
# grid_obj = GridSearchCV(clf_gb,param_grid_gb)
# 优化模型
# ------
# 测试数据的最终准确度分数:0.8706
# 测试数据的最终F得分:0.7511
# TODO: 用训练数据拟合网格搜索对象并找出最佳参数
grid_fit = grid_obj.fit(X_train, y_train)
# 得到最佳参数
best_clf = grid_fit.best_estimator_
# 使用没有调优的模型进行预测
predictions = (clf.fit(X_train, y_train)).predict(X_test)
best_predictions = best_clf.predict(X_test)
print('未优化的模型\n------')
print('测试数据的准确性评分:{:.4f}'.format(
accuracy_score(y_test, predictions)))
print('测试数据的F得分:{:.4f}'.format(
fbeta_score(y_test, predictions, beta=0.5)))
print('\n优化模型\n------')
print('测试数据的最终准确度分数:{:.4f}'.format(
accuracy_score(y_test, best_predictions)))
print('测试数据的最终F得分:{:.4f}'.format(
fbeta_score(y_test, best_predictions, beta=0.5)))
print('\n调优后的参数\n------')
print(grid_fit.best_params_)
print(best_clf.get_params())
未优化的模型
测试数据的准确性评分:0.8630
测试数据的F得分:0.7395
优化模型
测试数据的最终准确度分数:0.8649
测试数据的最终F得分:0.7398
调优后的参数
{'learning_rate': 1.4, 'n_estimators': 160}
{'algorithm': 'SAMME.R', 'base_estimator': None, 'learning_rate': 1.4, 'n_estimators': 160, 'random_state': 42}
5.6 最终模型评估
结果
评价指标 | 朴素预测器 | 未优化模型 | 优化后模型 |
准确率 | 0.2478 | 0.8630 | 0.8649 |
F得分 | 0.2917 | 0.7395 | 0.7398 |
特征的重要性
在数据上(比如我们这里使用的人口普查的数据)使用监督学习算法的一个重要的任务是决定哪些特征能够提供最强的预测能力。
通过专注于一些少量的有效特征和标签之间的关系,我们能够更加简单地理解这些现象,这在很多情况下都是十分有用的。在这个项目的情境下这表示我们希望选择一小部分特征,这些特征能够在预测被调查者是否年收入大于 $50,000 这个问题上有很强的预测能力。
选择一个有 属性(这是一个根据这个选择的分类器来对特征的重要性进行排序的函数)的scikit学习分类器(例如,AdaBoost,随机森林)。在下一个Python代码单元中用这个分类器拟合训练集数据并使用这个属性来决定这个人口普查数据中最重要的5个特征。feature_importance_
提取特征重要性
选择一个 中有 属性的监督学习分类器分类器,这个属性是一个在做预测的时候根据所选择的算法来对特征重要性进行排序的功能。scikit-learnfeature_importance_
在下面的代码单元中,你将要实现以下功能:
- 如果这个模型和你前面使用的三个模型不一样的话从 sklearn 中导入一个监督学习模型。
- 在整个训练集上训练一个监督学习模型。
- 使用模型中的 提取特征的重要性。.feature_importances_
# TODO: 导入一个拥有 'feature_importances_' 的监督学习模型
from xgboost import XGBClassifier
# TODO: 在训练集上建立一个监督学习模型
model = XGBClassifier()
model.fit(X_train, y_train)
# TODO: 提取特征重要性
importances = model.feature_importances_
# 绘制特征重要性
vs.feature_plot(importances, X_train, y_train)
pd.Series(importances,index=X_train.columns).sort_values(ascending=False)[:10]
特征选择
如果我们只是用可用特征的一个子集的话模型表现会怎么样?
通过使用更少的特征来训练,在评价指标的角度来看我们的期望是训练和预测的时间会更少。
从上面的可视化来看,我们可以看到前五个最重要的特征贡献了数据中所有特征中超过一半的重要性。
这提示我们可以尝试去减小特征空间,并简化模型需要学习的信息。下面代码单元将使用你前面发现的优化模型,并只使用五个最重要的特征在相同的训练集上训练模型。
np.argsort(importances)[::-1][:5]
array([2, 0, 3, 1, 4])
# 导入模型克隆功能
from sklearn.base import clone
# 减小特征空间
X_train_reduced = X_train[X_train.columns.values[(np.argsort(importances)[::-1])[:5]]]
X_test_reduced = X_test[X_test.columns.values[(np.argsort(importances)[::-1])[:5]]]
# 克隆之前得到的最优模型继续训练
clf = (clone(best_clf)).fit(X_train_reduced, y_train)
# 做出一个新的预测
reduced_predictions = clf.predict(X_test_reduced)
# 输出每一个版本的数据应用最终模型的分数
print('最终模型接受完整数据的训练\n------')
print('测试数据的准确性:{:.4f}'.format(
accuracy_score(y_test,best_predictions)))
print('测试数据的F分数:{:.4f}'.format(
fbeta_score(y_test,reduced_predictions,0.5)))
print('\n最终模型接受压缩数据的训练\n------')
print('测试数据的准确性:{:.4f}'.format(
accuracy_score(y_test,best_predictions)))
print('测试数据的F分数:{:.4f}'.format(
fbeta_score(y_test,reduced_predictions,0.5)))
最终模型接受完整数据的训练
测试数据的准确性:0.8649
测试数据的F分数:0.6855
最终模型接受压缩数据的训练
测试数据的准确性:0.8649
测试数据的F分数:0.6855
相关文章:
机器学习基础课程-5-课程实验
5.1 实验介绍 实验背景 在这个项目中,您将使用1994年美国人口普查收集的数据,选用几个监督学习算法以准确地建模被调查者的收入。然后,您将根据初步结果从中选择出最佳的候选算法,并进一步优化该算法以最好地建模这些数据。你的目…...
生成对抗网络(Generative Adversarial Networks ,GAN)
生成对抗网络是深度学习领域最具革命性的生成模型之一。 一 GAN框架 1.1组成 构造生成器(G)与判别器(D)进行动态对抗,实现数据的无监督生成。 G(造假者):接收噪声 ,…...
Linux——CMake的快速入门上手和保姆级使用介绍、一键执行shell脚本
目录 一、前言 二、CMake简介 三、CMake与其他常见的构建、编译工具的联系 四、CMake入门 1、CMake的使用注意事项 2、基本的概念和术语 3、CMake常用的预定义变量 4、CMakeLists.txt文件的基本结构 五、上手实操 1、示例 编辑 2、一个正式的工程构建 2.1基本构…...
GAN简读
Abstract 我们提出了一个通过同时训练两个模型的对抗过程来评估生成模型的新框架:一个生成模型 G G G用来捕捉数据特征,还有一个用于估计这个样本是来自训练样本还是 G G G的概率的判别模型 D D D, G G G的训练过程是最大化 D D D犯错的概率。这个框架就相当于一个minimax tw…...
Jsp技术入门指南【十四】实现基于MySQL+JDBC+JSP数据库验证的登录界面与登录跳转功能
Jsp技术入门指南【十四】实现基于MySQLJDBCJSP数据库验证的登录界面与登录跳转功能 前言第一步:加入驱动包与Maven第二步、创建并导入web库第三步、连接本地数据库的java代码核心代码讲解 第四步、创建数据库第五步、导入并修改JSP登录文件 前言 在之前的博客中&am…...
【漫话机器学习系列】259.神经网络参数的初始化(Initialization Of Neural Network Parameters)
神经网络参数初始化详解 在构建神经网络时,参数的初始化虽然只是一个开端步骤,但它对网络最终的训练效果和收敛速度有着至关重要的影响。本文将结合一张手绘风格图,深入浅出地讲解神经网络初始化的背景、方法及其数学依据,帮助大…...
如何设置FFmpeg实现对高分辨率视频进行转码
使用FFmpeg进行高分辨率视频转码的步骤如下:首先,确保FFmpeg支持GPU加速,通过命令ffmpeg -hwaccels检查CUDA支持。接着,下载样本视频进行测试,例如使用wget命令获取Blender基金会的样本视频。然后,使用FFmp…...
2025tg最新免费社工库机器人
中情局社工库 https://t.me/ZhongQingJuSGKBOT?start07c662145624d195aa098f0d39e6451d 小孩哥社工库 http://t.me/xiaohaigeSGK1_bot?startWGGVVrMgQiBslNE 冰墩墩个户机器人 t.me/bingdundung… 维基百科社工库 https://t.me/WikiSGKBot?start0b9d27c2e91b AI社工库…...
ps向pl传数据axi-4-lite
定义一个axi-4-lite ip,引出管脚 可以看到,ip的地址是这个 因为在定义axi-4-lite ip的时候定义了4个寄存器,其中只把第2个引出来,所以只需要往第2个写数据就可 即只有 (u32)(0x800000004) angle; 这个是有效的 这时pl就可以收到angle的值…...
scikit-learn在无监督学习算法的应用
哈喽,我是我不是小upper~ 前几天,写了一篇对scikit-learn在监督学习算法的应用详解,今天来说说关于sklearn在无监督算法方面的案例。 稍微接触过机器学习的朋友就知道,无监督学习是在没有标签的数据上进行训练的。其主要目的可能…...
聊聊JetCache的缓存构建
序 本文主要研究一下JetCache的缓存构建 invokeWithCached com/alicp/jetcache/anno/method/CacheHandler.java private static Object invokeWithCached(CacheInvokeContext context)throws Throwable {CacheInvokeConfig cic context.getCacheInvokeConfig();CachedAnnoC…...
【ios越狱包安装失败?uniapp导出ipa文件如何安装到苹果手机】苹果IOS直接安装IPA文件
问题场景: 提示:ipa是用于苹果设备安装的软件包资源 设备:iphone 13(未越狱) 安装包类型:ipa包 调试工具:hbuilderx 问题描述 提要:ios包无法安装 uniapp导出ios包无法安装 相信有小伙伴跟我一样&…...
浅析 Golang 内存管理
文章目录 浅析 Golang 内存管理栈(Stack)堆(Heap)堆 vs. 栈内存逃逸分析内存逃逸产生的原因避免内存逃逸的手段 内存泄露常见的内存泄露场景如何避免内存泄露?总结 浅析 Golang 内存管理 在 Golang 当中,堆…...
仿射变换 与 透视变换
仿射变换 与 透视变换 几种变换之间的关系 1、缩放 Rescale 1)变换矩阵 缩放变换矩阵,形为 : , 其中: 、 为 x轴 和 y轴的缩放因子,即 宽高的缩放因子 图像中的每一个像素点 (x, y),经过矩阵…...
Vue.js---嵌套的effect与effect栈
4.3嵌套的effect与effect栈 1、嵌套的effect effect是可以发生嵌套的 01 effect(function effectFn1() { 02 effect(function effectFn2() { /* ... */ }) 03 /* ... */ 04 })有这么一段代码: 01 // 原始数据 02 const data { foo: true, bar: true } 03 /…...
jQuery知识框架
一、jQuery 基础 核心概念 $ 或 jQuery:全局函数,用于选择元素或创建DOM对象。 链式调用:多数方法返回jQuery对象,支持连续操作。 文档就绪事件: $(document).ready(function() { /* 代码 */ }); // 简写 $(function…...
【Java学习笔记】hashCode方法
hashCode方法 注意:C要大写 作用:返回对象的哈希码值(可以当作是地址,真实的地址在 Java 虚拟机上),支持此方法是为了提高哈希表的性能 底层实现:实际上,由Object类定义的hashCod…...
[思维模式-37]:什么是事?什么是物?什么事物?如何通过数学的方法阐述事物?
一、基本概念 1、事(Event) “事”通常指的是人类在社会生活中的各种活动、行为、事件或情况,具有动态性和过程性,强调的是一种变化、发展或相互作用的流程。 特点 动态性:“事”往往涉及一系列的动作、变化和发展过程。例如&a…...
STM32-USART串口通信(9)
一、通信接口介绍 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。 当STM32想要实现一些功能,但是需要外挂一些其他模块才能实现,这就需要在两个设备之间连接上一根或多跟通信线,通过通信线路发送或者接…...
【内网渗透】——NTML以及Hash Relay
【内网渗透】——NTLM以及Hash Relay 文章目录 【内网渗透】——NTLM以及Hash Relay[toc]前情提要1.NTML网络认证机制1.1NTML协议1.2NET NTMLv21.3NTML的认证方式1.4NTLM hash的生成方法: 2.PTH(pass the hash)2.1原理2.2漏洞原理2.3实验环境2.4攻击过程…...
速查 Linux 常用指令 II
目录 一、网络管理命令1. 查看和配置网络设备:ifconfig1)重启网络命令2)重启网卡命令 2. 查看与设置路由:route3. 追踪网络路由:traceroute4. 查看端口信息和使用情况1)netstat 命令2)lsof 命令…...
基于 GPUGEEK平台进行vLLM环境部署DeepSeek-R1-70B
选择 GPUGEEK 平台的原因 算力资源丰富:GPUGEEK 提供多样且高性能的 GPU 资源,像英伟达高端 GPU 。DeepSeek - R1 - 70B 模型推理计算量巨大,需要强大算力支持,该平台能满足其对计算资源的高要求,保障推理高效运行。便…...
深入理解ThingsBoard的Actor模型
1、ThingsBoard系统中定义了哪些Actor ✅ ThingsBoard Actor 创建机制与作用对照表: Actor 类型 何时创建 由谁创建 是否缓存 作用描述 SystemActor 系统启动时 DefaultActorService / ActorSystem ✅ 是 ★ ThingsBoard 平台服务级别管理器:负责创建所有的Actor AppActor...
虚幻引擎5-Unreal Engine笔记之Qt与UE中的Meta和Property
虚幻引擎5-Unreal Engine笔记之Qt与UE中的Meta和Property code review! 文章目录 虚幻引擎5-Unreal Engine笔记之Qt与UE中的Meta和Property1.Qt 中的 Meta(元对象系统)1.1 主要功能1.2 如何实现1.2.1 例子1.2.2 访问 meta 信息 2.UE5 中的 Metaÿ…...
技术中台-核心技术介绍(微服务、云原生、DevOps等)
在企业数字化中台建设中,技术中台是支撑业务中台、数据中台及其他上层应用的底层技术基础设施,其核心目标是提供标准化、可复用的技术能力,降低业务开发门槛,提升系统稳定性与扩展性。技术中台的技术栈需覆盖从开发、运维到治理的…...
attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第二维度,第三维度
attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第1 维度,第二维度 attention_weights = torch.ones_like(prompt_embedding[:, :, 0]) 这行代码的作用是创建一个与 prompt_embedding[:, :, 0] 形状相同且所有元素都为 1 的张量,它用于初始化…...
2025年中国DevOps工具选型指南:主流平台能力横向对比
在数字化转型纵深发展的2025年,中国企业的DevOps工具选型呈现多元化态势。本文从技术架构、合规适配、生态整合三个维度,对Gitee、阿里云效(云效DevOps)、GitLab CE(中国版)三大主流平台进行客观对比分析&a…...
国产ETL数据集成软件和Informatica 相比如何
数据集成领域Informatica名号可谓无人不知无人不晓。作为国际知名的ETL工具,凭借其强大的功能和多年的市场积累,赢得了众多企业的信赖。然而,随着国内企业数字化转型的加速以及对数据安全、成本控制和本地化服务的需求日益增长,国…...
FFMPEG 与 mp4
1. FFmpeg 中的 start_time 与 time_base start_time 流的起始时间戳(单位:time_base),表示第一帧的呈现时间(Presentation Time)。通常用于同步多个流(如音频和视频)。 time_base …...
在RAG中 如何提高向量搜索的准确性?
在RAG(Retrieval-Augmented Generation)系统中,提高向量搜索的准确性需要从数据预处理、模型选择、算法优化和后处理等多个维度进行综合改进。以下是具体策略的详细分析: 一、优化数据质量与预处理 1. 数据清洗与结构化 去噪与规范化:去除停用词、拼写纠错、统一大小写和…...
Python调用SQLite及pandas相关API详解
前言 SQLite是一个轻量级的嵌入式关系数据库,它不需要独立的服务器进程,将数据存储在单一的磁盘文件中。Python内置了sqlite3模块,使得我们可以非常方便地操作SQLite数据库。同时,pandas作为Python数据分析的重要工具,…...
【Java学习笔记】finalize方法
finalize 方法 说明:实际开发中很少或者几乎不会重写finalize方法,更多的是应对面试考点 说明 (1)当对象被回收时,系统会自动调用该对象的 finalize 方法。子类可以重写该方法,做一些额外的资源释放操作&…...
MySQL之基础索引
目录 引言 1、创建索引 2、索引的原理 2、索引的类型 3、索引的使用 1.添加索引 2.删除索引 3.删除主键索引 4.修改索引 5.查询索引 引言 当一个数据库里面的数据特别多,比如800万,光是创建插入数据就要十几分钟,我们查询一条信息也…...
MCU程序加密保护(二)ID 验证法 加密与解密
STM32 微控制器内部具有一个 96 位全球唯一的 CPU ID,不可更改。开发者可利用此 ID 实现芯片绑定和程序加密,增强软件安全性。 ID 验证法就是利用这个 UID,对每颗芯片的身份进行识别和绑定,从而防止程序被复制。 实现方式…...
SparkSQL的基本使用
SparkSQL 是 Apache Spark 的一个模块,用于处理结构化数据。它提供了一个高性能、分布式的 SQL 查询引擎,可以轻松处理各种数据源,包括结构化数据、半结构化数据和非结构化数据12。 SparkSQL 的特点 易整合:SparkSQL 无缝整合了…...
QListWedget控件使用指南
QListWedget公共函数 函数签名功能描述QListWidget(QWidget *parent nullptr)构造函数,创建一个QListWidget对象,可指定父部件(默认为nullptr)。virtual ~QListWidget()虚析构函数,释放QListWidget对象及其资源。voi…...
primitive创建图像物体
本节我们学习使用entity来创建物体 我们以矩形为例,在输入矩形的四个点后运行程序 //使用entity创建矩形var rectangle viewer.entities.add({rectangle: {coordinates:Cesium.Rectangle.fromDegrees(//西边的经度90,//南边维度20,//东边经度110,//北边维度30 ),material:Ces…...
MySQL 服务器配置和管理(上)
MySQL 服务器简介 通常所说的 MySQL 服务器指的是mysqld(daemon 守护进程)程序,当运⾏mysqld后对外提供MySQL 服务,这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容,包括: • 服务器⽀持的启动选项。可以在命令⾏和…...
跨区域智能电网负荷预测:基于 PaddleFL 的创新探索
跨区域智能电网负荷预测:基于 PaddleFL 的创新探索 摘要: 本文聚焦跨区域智能电网负荷预测,提出基于 PaddleFL 框架的联邦学习方法,整合多地区智能电网数据,实现数据隐私保护下的高精度预测,为电网调度优化提供依据,推动智能电网发展。 一、引言 在当今社会,电力作为经…...
Java 重试机制详解
文章目录 1. 重试机制基础1.1 什么是重试机制1.2 重试机制的关键要素1.3 适合重试的场景2. 基础重试实现2.1 简单循环重试2.2 带延迟的重试2.3 指数退避策略2.4 添加随机抖动2.5 使用递归实现重试2.6 可重试异常过滤3. 常用重试库介绍3.1 Spring Retry3.1.1 依赖配置3.1.2 编程…...
Spark缓存---cache方法
在Spark 中,cache() 是用于优化计算性能的核心方法之一,但它有许多细节需要深入理解。以下是关于 cache() 的详细技术解析: 1. cache() 的本质 简化的 persist():cache() 是 persist(StorageLevel.MEMORY_ONLY) 的快捷方式&#…...
一分钟了解大语言模型(LLMs)
一分钟了解大语言模型(LLMs) A Minute to Know about Large Language Models (LLMs) By JacksonML 自从ChatGPT上线发布以来,在短短的两年多时间里,全球ChatBot(聊天机器人)发展异常迅猛,更为…...
当数控编程“联姻”AI:制造工厂的“智能大脑”如何炼成?
随着DeepSeek乃至AI人工智能技术在企业中得到了广泛的关注和使用,多数企业开始了AI探索之旅,迅易科技也不例外,且在不断地实践中强化了AI智能应用创新的强大能力。许多制造企业面临着工艺知识传承困难、编程效率低下等诸多挑战, 今…...
鸿蒙OSUniApp 实现的二维码扫描与生成组件#三方框架 #Uniapp
UniApp 实现的二维码扫描与生成组件 前言 最近在做一个电商小程序时,遇到了需要扫描和生成二维码的需求。在移动应用开发中,二维码功能已经成为标配,特别是在电商、社交和支付等场景下。UniApp作为一个跨平台开发框架,为我们提供…...
【Python 内置函数】
Python 内置函数是语言核心功能的直接体现,无需导入即可使用。以下是精选的 10 大类、50 核心内置函数详解,涵盖日常开发高频场景: 一、数据类型转换 函数示例说明int()int("123") → 123字符串/浮点数转整数float()float("3…...
鸿蒙OSUniApp开发支持多语言的国际化组件#三方框架 #Uniapp
使用UniApp开发支持多语言的国际化组件 在全球化的今天,一个优秀的应用往往需要支持多种语言以满足不同地区用户的需求。本文将详细讲解如何在UniApp框架中实现一套完整的国际化解决方案,从而轻松实现多语言切换功能。 前言 去年接手了一个面向国际市场…...
MySQL之基础事务
目录 引言: 什么是事务? 事务和锁 mysql数据库控制台事务的几个重要操作指令(transaction.sql) 1、事物操作示意图: 2.事务的隔离级别 四种隔离级别: 总结一下隔离指令 1. 查看当前隔离级别 …...
OpenHarmony系统HDF驱动开发介绍(补充)
一、HDF驱动简介 HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。 简单来说:HDF框架的驱动和Linux的驱动比较相似都是由配置文件和驱动…...
深度学习中的查全率与查准率:如何实现有效权衡
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...
文件名是 E:\20250512_191204.mp4, EV软件录屏,未保存直接关机损坏, 如何修复?
去github上下载untrunc 工具就能修复 https://github.com/anthwlock/untrunc/releases 如果访问不了 本机的 hosts文件设置 140.82.112.3 github.com 199.232.69.194 github.global.ssl.fastly.net 就能访问了 实在不行,从这里下载,传上去了 https://do…...