pip与conda区别

pipconda 都是用来安装和管理 Python 包的工具,但它们的工作方式和适用场景有所不同。以下是它们的主要区别:

1. 包管理的范围

  • pip:是 Python 官方的包管理工具,只用于安装 Python 包。它从 Python 包索引 (PyPI) 中获取包并安装。这意味着它只能安装 Python 包,不能直接处理其他类型的依赖(如系统库、C 库等)。
  • conda:是一个跨平台的包和环境管理工具,它不仅可以安装 Python 包,还可以安装其他语言(如 R、Java、C++ 等)以及非 Python 依赖(如系统库)。conda 能够管理整个环境(包括 Python 版本和库),并解决与系统库之间的依赖关系。

2. 依赖管理

  • pip:在安装包时,pip 仅会安装 Python 包及其 Python 依赖,而不处理系统级依赖。如果一个包依赖于特定的 C 库或其他非 Python 包,pip 不会自动解决这些问题,这可能导致一些复杂的兼容性问题。
  • conda:会同时处理 Python 包和非 Python 包的依赖。它会在安装时自动解决所有依赖,包括操作系统库、C 库等。因此,conda 在依赖关系处理上比 pip 更强大。

3. 包来源

  • pip:通过 PyPI(Python Package Index)来下载和安装包,PyPI 是一个包含大多数 Python 包的中央库。
  • conda:使用 Anaconda 仓库或其他 conda 仓库。Anaconda 仓库提供了大量的科学计算、数据分析相关的包,而不仅限于 Python 包。conda 还支持安装一些没有在 PyPI 上的包。

4. 环境管理

  • pip:本身不提供环境管理功能,但可以与 virtualenvvenv 等工具结合使用来创建虚拟环境。这些虚拟环境允许你为不同项目隔离依赖。
  • conda:内置环境管理功能,可以通过 conda create 命令直接创建隔离的环境,支持不同版本的 Python 以及其他软件的管理。conda 环境的管理比 pip + virtualenv 更加方便和高效。

5. 安装速度

  • pip:通常只安装 Python 包。对于某些包,特别是需要从源代码编译的包,安装可能会比较慢,尤其是在没有预编译二进制文件的情况下。
  • conda:由于它使用的是预编译的二进制包,安装速度通常更快,尤其是对于依赖项繁多的包(如 numpyscipy 等)。它无需从源代码编译,直接安装预编译的版本。

6. 跨平台支持

  • pip:支持所有操作系统,但在一些操作系统(尤其是 Windows)上,安装某些包时可能会遇到编译问题,尤其是 C 扩展包。
  • conda:同样支持多平台,并且在 Windows 系统上安装一些复杂的包(如 numpypandas 等)时,比 pip 更加稳定和方便,因为它会自动提供适合平台的预编译二进制文件。

7. 包版本冲突

  • pip:虽然可以安装特定版本的包,但如果项目中的多个包有不同的依赖版本,pip 并不能很好地解决这些版本冲突,需要手动处理依赖版本。
  • conda:在安装时,conda 会自动解析所有的依赖关系,确保包和其依赖的版本兼容,从而减少版本冲突。

8. 包更新

  • pip:更新包的方式通常是直接运行 pip install --upgrade <package>,但是它会仅更新 Python 包本身,不会考虑系统级的依赖。
  • conda:更新包时,conda 会同时考虑包的 Python 依赖和系统库依赖,可以更全面地管理包更新。

总结对比表:

特性 pip conda
包管理范围 只管理 Python 包 管理 Python 包和其他非 Python 包
依赖关系管理 只处理 Python 依赖 处理 Python 和非 Python 依赖
包来源 PyPI Anaconda 仓库等
环境管理 需配合 virtualenv 使用 内建环境管理
安装速度 慢(尤其是需要编译的包) 快(使用预编译二进制包)
跨平台支持 跨平台支持良好 更好的 Windows 支持
版本冲突处理 手动解决版本冲突 自动解决版本冲突

什么时候使用 pip,什么时候使用 conda

  • 如果你已经在使用 Anaconda 或 Miniconda,并且需要安装 Python 包及其相关依赖,conda 是更好的选择,因为它可以自动解决依赖并更好地管理环境。
  • 如果你没有使用 Anaconda 或只需要安装纯粹的 Python 包,pip 更为轻量和直接。

在实际使用中,有时你会发现两者可以结合使用:可以用 conda 安装 Python 环境和一些复杂的依赖,再用 pip 安装一些不在 Anaconda 仓库中的包。

jupyter转markdown

一、准备工作

安装nbconverter: nbconvert: Convert Notebooks to other formats

1
pip install nbconvert

注意依赖项:

  • 基本依赖:pandoc
1
pip install pandoc

二、使用方法

命令行:

1
$ jupyter nbconvert --to FORMAT notebook.ipynb

这里FORMAT 用具体的格式替换,如 markdown, html等。

例如:

1
$ jupyter nbconvert --to markdown notebook.ipynb

参考文献

Jupyter Notebook文件转markdown - 知乎

Python常用库

1. Numpy

numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。其部分功能如下:

ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++、Fortran等语言编写的代码的工具。

2. Pandas

pandas是python第三方库,提供高性能易用数据类型和分析工具 pandas基于numpy实现,常与numpy和matplotlib一同使用 pandas中有两大核心数据结构:Series(一维数据) 和 DataFrame(多特征数据,既有行索引,又有列索引)

3. PIL

PIL库是一个具有强大图像处理能力的第三方库 在命令行下的安装方法:pip install pillow 在使用过程中的引入方法:from PIL import Image Image 是 PIL 库中代表一个图像的类(对象) 图像是一个由像素组成的二维矩阵,每个元素是一个RGB值

4. Matplotlib

Matplotlib库由各种可视化类构成,内部结构复杂。 受Matlab启发,matplotlib.pylot是绘制各类可视化图形的命令字库,相当于快捷方式。

5. scikit-learn

scikit-learn(简称 sklearn)是一个开源的 Python 库,广泛应用于机器学习任务,提供了丰富的工具和算法,能够帮助数据科学家和机器学习工程师高效地进行数据预处理、模型训练、评估和优化。它基于 NumPySciPymatplotlib,具有以下主要特点和功能:

主要功能

  • 分类 (Classification) :用于预测数据点所属的类别(如垃圾邮件分类、疾病预测等)。
  • 回归 (Regression) :用于预测连续的数值(如房价预测、股票价格预测等)。
  • 聚类 (Clustering) :将数据点分为不同的簇或组(如客户细分、图像分割等)。
  • 降维 (Dimensionality Reduction) :减少数据的维度,常用于数据压缩和可视化。
  • 模型评估 (Model Evaluation) :提供评估工具,如交叉验证、准确率、F1 分数等。
  • 数据预处理 (Data Preprocessing) :包括标准化、归一化、缺失值处理、编码等。
  • 超参数调优 (Hyperparameter Tuning) :通过网格搜索(GridSearchCV)和随机搜索(RandomizedSearchCV)来优化模型超参数。

波士顿房价预测任务(线性回归、岭回归实现)

包括数据准备、模型训练、模型评估与选择、性能度量、参数选择

问题背景与数据集介绍

波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的“Hello World”。和大家对房价的普遍认知相同,波士顿地区的房价受诸多因素影响。美国某经济杂志登出波士顿房价数据集,该数据集包含506条观测信息,统计了13种可能影响房价的因素(输入变量)和该类型房屋的均价(输出变量),其中每条观测信息包含城镇犯罪率、一氧化氮浓度、住宅平均房间数、到中心区域的加权距离以及自住房平均房价等关于波士顿周边或者城镇房价的描述,期望通过分析影响波士顿房价的因素来构建房价预测模型。相关属性描述如下图所示,其中最后一项就是想要预测的房屋均价。

观测数据的示例如下图所示。

对于预测问题,可以根据预测输出的类型是连续的实数值,还是离散的标签,区分为回归任务和分类任务。因为房价是一个连续值,所以房价预测显然是一个回归任务。本次实验要求大家调用sklearn 的线性回归、岭回归模型来实现。

实现过程:

  1. 数据准备:导入数据、特征可视化
  2. 数据预处理:数据集划分、数据标准化处理
  3. 模型训练:线性回归、岭回归
  4. 模型评估与选择、参数选择

数据准备

导入数据

1
2
3
from sklearn.datasets import load_boston
boston = load_boston()
print(boston.DESCR)

数据可视化

通过观察不同属性与房价之间的关系,分析影响房价的主要因素。

boston.data 存储的是所有样本的属性值,boston.target 存储的是所有样本的房价。下段程序所展示的13幅图中,横坐标是该属性的取值,纵坐标是房价值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 导入matplotlib库中的pyplot模块,用于绘制图表
import matplotlib.pyplot as plt

# 设置图表的大小,figsize指定了图表的宽度和高度,单位是英寸
plt.figure(figsize=(20, 10))

# 遍历波士顿数据集的13个特征
for i in range(13):
# 创建一个2行7列的子图,并在当前子图中绘制散点图
plt.subplot(2, 7, i + 1) # 2行7列的第i+1个子图

# 绘制散点图:x轴是第i个特征,y轴是目标值(房价中位数),s指定点的大小
plt.scatter(boston.data[:, i], boston.target, s=20)

# 设置当前子图的标题,显示当前特征的名称
plt.title(boston.feature_names[i])

# 保存当前图表为PNG格式的图片,文件名为img.png
plt.savefig('img.png')

# 显示绘制的所有子图
plt.show()

img

数据预处理

任务1:数据集划分

调用sklearn.model_selection中的train_test_split()函数,把boston数据集分为训练集和测试集,划分比例是4:1。

补全代码:

1
2
3
4
5
6
7
from sklearn.model_selection import train_test_split
import numpy as np
# 加载波士顿房价数据集
boston = load_boston()

# 将数据集划分为训练集和测试集,test_size=0.2 表示测试集占20%,即训练集占80%
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2)

结果:

  • X_train:训练集的特征数据,形状为 (404, 13),即 80% 的数据(506 * 0.8 = 404 个样本),每个样本有 13 个特征。
  • X_test:测试集的特征数据,形状为 (102, 13),即 20% 的数据(506 * 0.2 = 102 个样本)。
  • y_train:训练集的目标值,形状为 (404,),即对应训练集的 404 个房价中位数。
  • y_test:测试集的目标值,形状为 (102,),即对应测试集的 102 个房价中位数。

总结:

  • train_test_split() 将数据集(包括特征和目标值)按照指定的比例随机划分为训练集和测试集。划分后的数据将用于模型的训练和评估,确保模型评估时使用的数据不会在训练过程中被“看见”。
  • test_size=0.2 表示将 20% 的数据作为测试集,80% 的数据作为训练集。
  • random_state=42 确保每次划分数据集时能得到一致的结果,保证实验的可复现性。

任务2:数据标准化处理:

1. Z-score标准化

首先使用StandardScaler()函数初始化对属性值的标准化器,然后调用fit_transform()方法对训练数据进行Z-score标准化,再将这个标准化器调用transform()方法用于测试数据的标准化。

补全代码:

1
2
3
4
5
6
7
8
9
10
11
from sklearn.preprocessing import StandardScaler
# 初始化对属性值的标准化器
ss_X = StandardScaler()
# ss_X调用fit_transform()和transform()方法对训练数据和测试数据进行标准化
# 对训练数据进行标准化,fit_transform() 方法会计算训练数据的均值和标准差,并应用到训练数据
# 训练数据X_train会被标准化为均值0,标准差1
X_train = ss_X.fit_transform(X_train)

# 对测试数据进行标准化,使用transform()方法来使用训练数据的均值和标准差来标准化测试数据
# 注意:测试数据不能再用fit_transform(),否则会使用测试数据的统计量,导致数据泄露
X_test = ss_X.transform(X_test)

Z-score 标准化的过程是将数据转换为均值为0,标准差为1的分布。StandardScaler()scikit-learn 提供的标准化工具,它通过去掉均值并除以标准差来实现这一标准化。

代码解释:

对训练数据进行标准化

1
X_train = ss_X.fit_transform(X_train)
- fit():计算训练数据的均值和标准差。 - transform():使用训练数据的均值和标准差将数据标准化。 - fit_transform():这两个操作结合在一起,计算并转换训练数据,使其均值为0,标准差为1。

对测试数据进行标准化

1
X_test = ss_X.transform(X_test)
- 对测试数据应用 transform() 方法时,不会重新计算均值和标准差,而是使用在训练数据上计算得到的均值和标准差对测试数据进行转换。 - 这确保了测试数据的标准化是基于训练数据的统计信息,而不是测试数据本身的统计信息。

2. MinMax标准化

首先使用StandardScaler()函数初始化对属性值的标准化器,然后调用fit_transform()方法对训练数据进行Z-score标准化,再将这个标准化器调用transform()方法用于测试数据的标准化。

补全代码:

1
2
3
4
5
6
from sklearn.preprocessing import MinMaxScaler
# 初始化对属性值的标准化器
mm_X = MinMaxScaler()
# mm_X调用fit_transform()和transform()方法对训练数据和测试数据进行MinMax标准化
X_train1 = mm_X.fit_transform(X_train)
X_test1 = mm_X.transform(X_test)

MinMax 标准化(也称为 归一化)中,数据将被缩放到指定的最小值和最大值之间,通常是将数据缩放到 [0, 1] 范围内。这对于那些对特征的绝对范围敏感的算法非常有效。

MinMaxScalerscikit-learn 提供的一个标准化工具,它会将每个特征缩放到一个指定的范围内,默认情况下是 [0, 1]

代码解释:

对训练数据进行 MinMax 标准化

1
X_train1 = mm_X.fit_transform(X_train)
- fit_transform() 方法会计算训练数据的最小值和最大值,并将数据缩放到 [0, 1] 范围内。 - fit():计算训练数据的最小值和最大值。 - transform():根据计算出的最小值和最大值,进行数据的转换。 - fit_transform() 是这两个操作的组合,直接返回标准化后的训练数据。

对测试数据进行 MinMax 标准化

1
X_test1 = mm_X.transform(X_test)
- transform() 方法会使用训练数据上的最小值和最大值来转换测试数据。 - 注意transform() 仅仅使用训练数据的统计量(即最小值和最大值)来对测试数据进行标准化,避免了数据泄露问题。如果对测试数据使用 fit_transform(),就会导致模型从测试数据中学习统计量,破坏了训练和测试数据的独立性。

MinMax 标准化是一种常用的数据预处理方法,尤其适用于特征的取值范围差异较大时。它将每个特征的最小值映射到 0,最大值映射到 1,其他值则在该区间内按比例进行缩放。这样做的好处是避免了某些特征因数值范围较大而在训练模型时占据主导地位,尤其是对于需要计算距离或内积的模型,如 KNN、SVM 等,使用 MinMax 标准化后的数据会使模型训练更加稳定。

模型训练与评估

任务3.1:线性回归模型训练

调用sklearn.linear_model中的LinearRegression()函数,对训练集(X_train,y_train)进行模型训练,并预测测试集X_test的房价lr_y_predict。

补全代码:

1
2
3
4
5
6
7
8
from sklearn.linear_model import LinearRegression
# 初始化线性回归模型
lr = LinearRegression()
# 线性回归模型训练
lr.fit(X_train, y_train) # 使用训练集数据训练模型

# 模型预测
lr_y_predict = lr.predict(X_test) # 使用训练好的模型对测试集数据进行预测

代码解释:

训练模型

1
lr.fit(X_train, y_train)
- fit() 方法会使用训练集数据 (X_train, y_train) 来训练线性回归模型。训练过程就是计算线性回归模型的系数(权重)和截距,以使预测值最接近真实目标值。

预测房价

1
lr_y_predict = lr.predict(X_test)
- predict() 方法会使用已经训练好的模型来对测试集 X_test 进行预测,返回预测的房价(即预测值 lr_y_predict)。模型根据训练时学到的关系来预测测试集中的每个样本的房价。

任务3.2:线性回归模型评估

回归模型常用的三种评价指标:(1)R方分数(决定系数)、(2)MSE均方误差、以及(3)MAE平均绝对误差。

方法一:调用sklearn.metrics中的相关函数,计算测试结果lr_y_predict与真实结果y_test之间的误差或精度。

1
2
3
4
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
print ('the value of R-squared of LR is',r2_score(y_test,lr_y_predict))
print ('the MSE of LR is',mean_squared_error(y_test,lr_y_predict))
print ('the MAE of LR is',mean_absolute_error(y_test,lr_y_predict))
the value of R-squared of LR is 0.7250808093832966
the MSE of LR is 23.56944609104811
the MAE of LR is 3.302381007591344

方法二:自己编写函数,计算上述指标。本实验要求学生至少完成MSE均方误差的计算,并打印输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 请在下方作答
# 计算R²(决定系数)
def calculate_r2(y_true, y_pred):
# R² = 1 - (SS_res / SS_tot)
ss_res = ((y_true - y_pred) ** 2).sum() # 残差平方和
ss_tot = ((y_true - y_true.mean()) ** 2).sum() # 总平方和
r2_score = 1 - (ss_res / ss_tot) # 决定系数
return r2_score

# 计算MSE(均方误差)
def calculate_mse(y_true, y_pred):
mse = mean_squared_error(y_true, y_pred)
return mse

# 计算MAE(平均绝对误差)
def calculate_mae(y_true, y_pred):
mae = mean_absolute_error(y_true, y_pred)
return mae

# 评估模型
r2 = calculate_r2(y_test, lr_y_predict) # R²
mse = calculate_mse(y_test, lr_y_predict) # MSE
mae = calculate_mae(y_test, lr_y_predict) # MAE

# 输出结果
print(f"R² (决定系数): {r2}")
print(f"MSE (均方误差): {mse}")
print(f"MAE (平均绝对误差): {mae}")
R² (决定系数): 0.7250808093832966
MSE (均方误差): 23.56944609104811
MAE (平均绝对误差): 3.302381007591344

下面是 R²(决定系数)MSE(均方误差)MAE(平均绝对误差) 的计算公式:

1. R²(决定系数) 计算公式:

R² 衡量模型对目标变量变化的解释程度。它的取值范围为 0 到 1,越接近 1,表示模型越能解释数据的变异性。

公式: $$ R^2=1-\frac{\sum_{i=1}^{n}(y_i-\hat{y}_i)^2}{\sum_{i=1}^{n}(y_i-\bar{y})^2} $$

  • ( $y_i $):实际值(真实的目标值)。
  • ( i ):预测值(模型预测的目标值)。
  • ( ):实际值的均值( $\bar{y} = \frac{1}{n} \sum_{i=1}^{n} y_i$ )。
  • ( n ):样本数。

解释:

  • 分子部分是 残差平方和(RSS),衡量预测值与真实值之间的差异。
  • 分母部分是 总平方和(TSS),衡量真实值与均值之间的差异。
  • R² 越接近 1,表示模型的拟合度越好。

2. MSE(均方误差) 计算公式:

MSE 衡量预测值与真实值之间差异的平方和的平均值,是一种常用的回归模型评估指标。

公式: $$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$

  • ( yi ):实际值。
  • ( i):预测值。
  • ( n ):样本数。

解释:

  • MSE 是实际值与预测值之间差异的平方和的平均值,越小表示模型的预测误差越小。

3. MAE(平均绝对误差) 计算公式:

MAE 衡量预测值与真实值之间差异的绝对值的平均值,也是一种常用的回归模型评估指标。

公式: $$ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$

  • ( yi ):实际值。
  • ( i ):预测值。
  • ( n ):样本数。

解释:

  • MAE 是实际值与预测值之间差异的绝对值的平均值,越小表示模型的预测性能越好。

总结:

  • R²(决定系数):度量模型拟合优度,越接近 1 表示模型越好。
  • MSE(均方误差):越小,表示模型的预测误差越小。
  • MAE(平均绝对误差):越小,表示模型在预测时的绝对误差越小。

任务3.3:岭回归模型训练

调用sklearn.linear_model中的Ridge()函数(参数设置为5),对训练集(X_train,y_train)进行模型训练,并预测测试集X_test的房价rd_y_predict。

补全代码:

1
2
3
4
5
6
7
8
from sklearn.linear_model import Ridge
rd = Ridge(alpha=5)
#岭回归模型训练
rd.fit(X_train, y_train)
# 输出训练后的模型系数(回归系数)
print(rd.coef_)
#模型测试
rd_y_predict = rd.predict(X_test)
[-0.89921997  1.17687007  0.06847273  0.58380163 -2.09273127  2.39227753
  0.15081088 -3.06269707  2.53630955 -1.8549535  -2.24256957  0.89722135
 -3.79040179]

岭回归(Ridge Regression)

岭回归(Ridge Regression),又称 L2 正则化回归,是一种扩展了普通最小二乘回归(OLS)的回归模型。其核心思想是在最小化 残差平方和(即普通最小二乘回归的目标函数)的同时,加入一个 正则化项,用于惩罚模型的复杂性,避免过拟合。

岭回归的公式

岭回归的目标函数为: $$ \text{minimize} \quad \left( \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \alpha \sum_{j=1}^{p} \beta_j^2 \right) $$ 其中:

  • ( yi ):实际观测值。
  • ( i ):模型预测值。
  • ( βj ):模型的回归系数。
  • ( α ):正则化强度(超参数),控制正则化项的权重。

关键点:

  1. 残差平方和:普通最小二乘回归的目标函数是最小化预测值和真实值之间的差异平方和:$\sum_{i=1}^{n} (y_i - \hat{y}_i)^2$
  2. L2 正则化:岭回归在最小化残差平方和的同时,加上一个正则化项$ _{j=1}^{p} _j^2 $,用来限制回归系数的大小。这个正则化项惩罚过大的系数,使得系数趋向于 0,但不会完全为 0(与 Lasso 回归不同,Lasso 是 L1 正则化,会使部分系数变为 0)。
    • $$:是岭回归的正则化参数,控制惩罚项的强度。较大的 ( ) 值会增加正则化的惩罚,使模型的系数变得较小,从而减少过拟合。

岭回归的作用

  • 防止过拟合:在普通的最小二乘回归中,若特征非常多,模型可能会在训练数据上表现得非常好,但却在测试数据上表现得较差(过拟合)。通过在回归系数上施加惩罚,岭回归减少了模型的复杂度,从而帮助防止过拟合。
  • 适应多重共线性:当特征之间存在强烈的相关性时(即多重共线性),普通的最小二乘回归可能无法得出稳定的回归系数。岭回归通过正则化项使得模型更稳定,避免共线性问题带来的不稳定性。

岭回归与普通最小二乘回归的区别

  • 普通最小二乘回归:最小化残差平方和,没有对回归系数施加任何惩罚。因此,模型会根据训练数据的噪声来拟合训练数据,可能导致过拟合。
  • 岭回归:最小化残差平方和,并加上正则化项,控制回归系数的大小,防止模型复杂度过高,减少过拟合。

岭回归的超参数 ( α )

  • ( α ):是岭回归中的超参数,控制正则化项的强度。
    • 当 ( = 0 ) 时,岭回归退化为普通的最小二乘回归。
    • 当 ( ) 较大时,模型的回归系数被更多地惩罚,减少了过拟合的风险,但也可能导致欠拟合(即模型对数据的拟合能力不足)。

任务3.4:岭回归模型评估

与线性回归一样,岭回归模型有两种方法计算评价指标,这里调用sklearn.metrics来实现。

1
2
3
4
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
print('the value of R-squared of Ridge is',r2_score(y_test,rd_y_predict ))
print('the MSE of Ridge is',mean_squared_error(y_test,rd_y_predict))
print('the MAE of Ridge is',mean_absolute_error(y_test,rd_y_predict))
the value of R-squared of Ridge is 0.7279447933421523
the MSE of Ridge is 23.323910246960786
the MAE of Ridge is 3.2535718613670053

参数选择

任务4:运用交叉验证选择模型参数

岭回归模型参数是正则化参数alpha,前面把它设置为5。为了选择最优参数,对训练集进行10次10折交叉验证。具体地,参数选择在[0,10]范围内,以1为步长,进行选择。 1. 总共进行11次实验(不同alpha值),每次实验将训练数据随机分成10份,重复10次; 2. 每一次划分,任意9份做训练,剩余1份测试,共执行10次,测试结果取平均; 3. 再将所有划分的结果再取平均,作为这一次alpha取值的分数; 4. 比较不同alpha取值的交叉验证模型分数,来选择其中表现最好的(分数最高的)模型的alpha值; 5. 用上述选择的alpha值对训练数据重新训练模型,再测试评估。

补全代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from sklearn.model_selection import cross_val_score 
from sklearn.model_selection import KFold


cv_score_list = []
for i in range(11):
# alpha 取不同值
rd = Ridge(alpha=i)
avg_score_cross = []
# 进行10次随机划分
for j in range(10):
#调用KFold()实现10折划分
kf = KFold(n_splits=10, shuffle=True, random_state=j)
#调用cross_val_score()计算训练集本次10折划分的分数
score_cross = cross_val_score(rd, X_train, y_train, cv=kf, scoring='neg_mean_squared_error')
avg_score_cross.append(np.mean(score_cross))
cv_score_list.append(np.mean(avg_score_cross))

plt.plot(range(11), cv_score_list)
plt.show()

# cv_score_list中找到分数最大的模型所对应的alpha取值
index = np.argmax(cv_score_list)
rd = Ridge(alpha=index)
#岭回归模型训练
rd.fit(X_train, y_train)
#模型测试
rd_y_predict = rd.predict(X_test)
# 打印模型评估结果
from sklearn.metrics import mean_squared_error, mean_absolute_error
print(f"Best Alpha: {index}")
print(f"Mean Squared Error: {mean_squared_error(y_test, rd_y_predict)}")
print(f"Mean Absolute Error: {mean_absolute_error(y_test, rd_y_predict)}")
Best Alpha: 4
Mean Squared Error: 23.35986469628359
Mean Absolute Error: 3.260923268350155

二分类问题

任务5:波士顿房价二分类问题

为了了解分类问题的建模与评估,本任务将连续值的波士顿房价数值使用阈值进行二值化(0,1,例如:廉价房、品质房),可以将房价预测的回归问题,改为简单的二分类问题。

同样是包括四个步骤:数据准备、数据预处理、模型训练、模型评估与选择。

下面的程序使用方法一调用sklearn.metrics中的相应函数计算预测结果的准确率accuracy、f1 score、auc值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score

boston = load_boston()
# 房价数值二值化
threshold = np.mean(boston.target)
labels = (boston.target>threshold).astype(np.int_)

# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(boston.data, labels, test_size=0.2, random_state=42)
# 省略数据预处理步骤

# 模型训练
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
# 模型训练:我们使用 LogisticRegression(线性回归常用于回归问题,但 Logistic Regression 更适合于二分类问题)
lr = LogisticRegression(max_iter=10000) # 设置最大迭代次数为10000以确保收敛

# 训练模型
lr.fit(X_train, y_train)

# 模型预测:对测试集进行预测
lr_y_predict = lr.predict(X_test)

# 模型评估
print('The accuracy score of LR is', accuracy_score(y_test, lr_y_predict)) # 准确率
print('The f1 score of LR is', f1_score(y_test, lr_y_predict)) # F1 分数
print('The auc of LR is', roc_auc_score(y_test, lr_y_predict)) # AUC(曲线下面积)
The accuracy score of LR is 0.9117647058823529
The f1 score of LR is 0.8695652173913043
The auc of LR is 0.89002079002079


f:\project python\.conda\lib\site-packages\sklearn\utils\deprecation.py:87: FutureWarning: Function load_boston is deprecated; `load_boston` is deprecated in 1.0 and will be removed in 1.2.

    The Boston housing prices dataset has an ethical problem. You can refer to
    the documentation of this function for further details.

    The scikit-learn maintainers therefore strongly discourage the use of this
    dataset unless the purpose of the code is to study and educate about
    ethical issues in data science and machine learning.

    In this special case, you can fetch the dataset from the original
    source::

        import pandas as pd
        import numpy as np

        data_url = "http://lib.stat.cmu.edu/datasets/boston"
        raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
        data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
        target = raw_df.values[1::2, 2]

    Alternative datasets include the California housing dataset (i.e.
    :func:`~sklearn.datasets.fetch_california_housing`) and the Ames housing
    dataset. You can load the datasets as follows::

        from sklearn.datasets import fetch_california_housing
        housing = fetch_california_housing()

    for the California housing dataset and::

        from sklearn.datasets import fetch_openml
        housing = fetch_openml(name="house_prices", as_frame=True)

    for the Ames housing dataset.
  warnings.warn(msg, category=FutureWarning)

方法二:自己编写函数,计算上述指标。

本实验要求学生至少完成accuracy与f1 score的计算,并打印输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 请在下方作答
from sklearn.metrics import confusion_matrix
# 计算准确率(Accuracy)
def calculate_accuracy(y_true, y_pred):
correct = np.sum(y_true == y_pred) # 计算正确预测的数量
total = len(y_true) # 总样本数
accuracy = correct / total # 准确率
return accuracy

# 计算F1分数(F1 Score)
def calculate_f1_score(y_true, y_pred):
cm = confusion_matrix(y_true, y_pred)
# 提取混淆矩阵中的 TP, FP, FN
tp = cm[1, 1] # True Positives
fp = cm[0, 1] # False Positives
fn = cm[1, 0] # False Negatives
precision = tp / (tp + fp) if (tp + fp) != 0 else 0
recall = tp / (tp + fn) if (tp + fn) != 0 else 0
# 计算 F1 分数
f1 = 2 * (precision * recall) / (precision + recall) if (precision + recall) != 0 else 0
return f1


accuracy = calculate_accuracy(y_test, lr_y_predict)
f1_score = calculate_f1_score(y_test, lr_y_predict)

# 输出结果
print(f"Accuracy: {accuracy}")
print(f"F1 Score: {f1_score}")
Accuracy: 0.9117647058823529
F1 Score: 0.8695652173913043

1. 准确率 (Accuracy)

准确率是正确分类的样本数与总样本数之比。

公式: $$ \text{Accuracy} = \frac{\text{正确预测的数量}}{\text{总样本数}} $$

2. F1 分数 (F1 Score)

F1 分数是准确率 (Precision) 和召回率 (Recall) 的调和平均数。

公式: $$ F1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} $$ 其中: $$ \text{Precision} = \frac{\text{True Positive}}{\text{True Positive} + \text{False Positive}} $$

$$ \text{Recall} = \frac{\text{True Positive}}{\text{True Positive} + \text{False Negative}} $$

3. AUC (Area Under the Curve)

AUC 是 ROC 曲线下面积,用于衡量分类模型的性能,范围在 0 到 1 之间,越接近 1,模型表现越好。AUC 是一个广泛使用的评估二分类问题模型的性能的指标。

机器学习数据预处理基础

1. One-Hot编码

任务介绍

  • 使用Pandas中的value_counts()函数,查看data中的特征User continent的取值类型, 并打印输出的内容;
  • 使用pandas中的get_dummies()函数对data中的特征User continent进行One-Hot编码,参数prefix为User continent_;
  • 将编码后的结果保存在encode_uc中,并输出变量的前5行内容。

预期实验结果

补全代码;

1
2
3
4
5
6
7
8
9
10
import pandas as pd 
data = pd.read_csv('user_review.csv')
# 请在下方作答 #
# value_counts() 函数统计并输出 "User continent" 列中各大陆出现的次数
print(data['User continent'].value_counts())
# 使用 get_dummies() 对 "User continent" 列进行 One-Hot 编码
# One-hot编码是一种将类别变量转换为多个二进制特征列的技术,
# 每个类别对应一列,如果该行数据属于该类别则取值为1,否则为0
encode_uc = pd.get_dummies(data['User continent'], prefix='User continent_')
print(encode_uc)

​ User continent ​ North America 296 ​ Europe 118 ​ Oceania 41 ​ Asia 36 ​ Africa 7 ​ South America 6 ​ Name: count, dtype: int64 ​ User continent__Africa User continent__Asia User continent__Europe
​0 False False False
​1 False False False
​2 False False False
​3 False False True
​4 False False False
​.. … … …
​499 False False True
​500 False False False
​501 False False False
​502 False False False
​503 False False False

​User continent__North America User continent__Oceania
​0 True False
​1 True False
​2 True False
​3 False False
​4 True False
​.. … …
​499 False False
​500 True False
​501 True False
​502 True False
​503 True False

​User continent__South America
​0 False
​1 False
​2 False
​3 False
​4 False
​.. …
​499 False
​500 False
​501 False
​502 False
​503 False

​[504 rows x 6 columns] ​

2. 缺失值填补

任务介绍

  • 使用pandas中的value_counts()函数打印输出data中的特征Traveler type的取值统计信息, 并查看其是否含有缺失值;
  • 如果存在缺失值,将特征Traveler type在其他样本中取值频数最多的值保存在变量freq_v中,并使用freq_v进行缺失值填充;
  • 再次打印输出特征Traveler type的取值统计信息。

预期实验结果

补全代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pandas as pd 
data = pd.read_csv('user_review.csv')

# value_counts(dropna=False) 会包括缺失值(NaN)在内
print(data['Traveler type'].value_counts(dropna=False))


# idxmax()会获取频数最多的取值
freq_v = data['Traveler type'].value_counts().idxmax()

# freq_v会替代缺失值
data['Traveler type'] = data['Traveler type'].fillna(freq_v)

### 打印
print('')
print(u'缺失值填充完之后:')
print( '')
print(data['Traveler type'].value_counts(dropna=False))

3. 特征标准化

任务1:

  • 使用sklearn中preprocessing模块下的StandardScaler()函数对data的特征Score进行Z-score标准化;
  • 将特征取值的均值保存在变量score_mean中,并打印;
  • 将特征取值的方差保存在变量score_var中,并打印。

预期实验结果

fa64d89b-3dc9-4b07-b27f-210b56e583ed

补全代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pandas as pd 
# sklearn是一个用于机器学习的Python库,提供了各种分类、回归、聚类算法,
# 包括支持向量机、随机森林、梯度提升等。它还包含了用于数据预处理、特征提取和模型选择的工具。
from sklearn.preprocessing import StandardScaler
data = pd.read_csv('user_review.csv')

# 请在下方作答 #
## 创建Z-score对象
## Z-score标准化是一种将数据转换为均值为0,标准差为1的标准正态分布的方法

## 初始化StandardScaler对象,用于执行Z-score标准化
std_scaler = StandardScaler()

## Score特征标准化,使用fit_transform()方法
# fit_transform() 会先计算出该特征的均值和标准差,然后进行标准化
normal_df = std_scaler.fit_transform(data[['Score']])

## 均值
# StandardScaler 会自动计算并存储 'Score' 列的均值,这个值在标准化过程中用来进行数据转换
score_mean = std_scaler.mean_

## 方差
# 方差也是 StandardScaler 会计算的一个参数,表示数据的离散程度
score_var = std_scaler.var_

## 打印
print (score_mean)
print (score_var)

## 打印前五行内容
normal_df[:5]

​ [4.12301587] ​ [1.01264487] ​

​ array([[ 0.87149149], ​ [-1.11598231], ​ [ 0.87149149], ​ [-0.12224541], ​ [-0.12224541]])

任务2:

  • 自定义函数min_max()实现MinMax标准化,输入参数data为要进行标准化的数据,输出为标准化后的数据。
  • 使自定义的min_max()函数对data的特征Score进行MinMax标准化,输出结果保存在score_transformed中,并打印变量的前5行内容

预期结果

补全代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pandas as pd 
data = pd.read_csv('user_review.csv')

# 请在下方作答 #
def min_max(data):

## 最小值
data_min = data.min()
## 最大值
data_max = data.max()
## 最大值与最小值之间的差值
data_range=data_max-data_min
## 根据MinMax标准化的定义实现
#MinMax 标准化(最小-最大标准化)是一种数据预处理方法,
# 旨在将数据的所有特征(列)缩放到一个指定的范围,通常是 [0, 1]。
# 这种标准化方法将原始数据通过线性变换映射到新的范围。
new_data = (data-data_min)/data_range# MinMax标准化公式: (x - min) / (max - min)

## 返回结果
return new_data

## 调用min_max()函数
score_transformed = min_max(data['Score'])

## 打印变量的前5行内容
score_transformed.head()

​ 0 1.00 ​ 1 0.50 ​ 2 1.00 ​ 3 0.75 ​ 4 0.75 ​ Name: Score, dtype: float64

任务3:

  • 自定义logistic()函数,输入参数为要进行标准化的数据,输出结果为经过标准化后的数据;
  • 使用自定义函数对data的特征Member years进行Logsitic标准化,结果保存在member_transformed中,并输出变量的前5行内容。

预期结果:

补全代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ogistic 标准化(Logistic Normalization)是一个将数据转换为 (0, 1) 范围的过程,
# 通常使用 Logistic 函数(也称为 Sigmoid 函数)。
# 它是一种非线性转换方法,常用于神经网络和其他需要将数据映射到概率范围的场景。
import pandas as pd
data = pd.read_csv('user_review.csv')

# 请在下方作答 #
def logistic(data):

import numpy as np
import warnings
warnings.filterwarnings("ignore")

## 计算 1 + e^(-x)
denominator = 1+ np.exp(-data)# 使用 np.exp() 计算 e^(-x)

## 实现logistic标准化
new_data = 1/denominator
## 返回结果
return new_data

## 对特征Member years进行logsitic标准化
member_transformed = logistic(data['Member years'])

## 打印内容
member_transformed.head()

​ 0 0.999877 ​ 1 0.952574 ​ 2 0.880797 ​ 3 0.997527 ​ 4 0.999089 ​ Name: Member years, dtype: float64

4. 特征离散化

任务介绍

  • 使用Pandas的qcut()函数对data中的特征Member years进行等频离散化,结果保存在bins中;
  • 使用pd.value_counts()函数统计categorical对象bins的取值信息。

预期结果

补全代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd 
data = pd.read_csv('user_review.csv')

# 请在下方作答 #

## 返回bins
# q=4 表示将数据分成 4 个区间
bins = pd.qcut(data['Member years'], q=4, labels=["(-1806.001, 2.0]", "(2.0, 4.0]", "(4.0, 6.0]", "(6.0, 13.0]"])

## 统计取值信息
# 使用value_counts()函数统计bins中每个类别的数量,得到离散化后的各个类别的分布情况
value_counts = pd.value_counts(bins)

print(value_counts)

​ Member years ​ (-1806.001, 2.0] 156 ​ (6.0, 13.0] 124 ​ (2.0, 4.0] 123 ​ (4.0, 6.0] 101 ​ Name: count, dtype: int64 ​

5. 离群值检测

任务介绍

  • 使用拉依达准则对data的特征Member years进行离群值检测;
  • 如果存在离群值,输出离群值的个数outlier_num,并将包含离群值的数据记录保存在变量outeliers中,并打印变量内容。

预期结果

补全代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import pandas as pd
import numpy as np

# 读取csv文件到DataFrame
data = pd.read_csv('user_review.csv')

# 提取'Member years'这一列
member_data = data[['Member years']]

'''
拉伊达准则
计算四分位数(Q1 和 Q3):计算Member years特征的第25百分位数(Q1)和第75百分位数(Q3)。
计算IQR(Interquartile Range):IQR = Q3 - Q1。
判断离群值:低于 Q1 - 1.5 * IQR 或高于 Q3 + 1.5 * IQR 的数据点视为离群值。
统计离群值的个数,并提取包含离群值的记录。
'''

# 计算四分位数
Q1 = member_data['Member years'].quantile(0.25) # 第25百分位数
Q3 = member_data['Member years'].quantile(0.75) # 第75百分位数

# 计算IQR(四分位间距)
IQR = Q3 - Q1

# 写出过滤条件:低于 Q1 - 1.5 * IQR 或 高于 Q3 + 1.5 * IQR 的值为离群值
outlier_judge = (member_data['Member years'] < (Q1 - 1.5 * IQR)) | (member_data['Member years'] > (Q3 + 1.5 * IQR))

# 统计离群值的个数
outlier_num = outlier_judge.sum()

# 提取包含离群值的样本记录
outliers = data[outlier_judge]

# 打印离群值记录
print(outliers)

​ User country User continent Member years Traveler type
​75 USA North America -1806 Solo
​143 USA North America 13 Couples

​Hotel name Hotel stars Nr. rooms Score
​75 Treasure Island- TI Hotel & Casino 4.0 2884 5
​143 Caesars Palace 5.0 3348 4

人生匆匆啊

今天是2025年3月5日,是我的20岁生日,现在是9点45分,刚上完算法课,逃了上机课来到了机房,在开始一天的学习之前,我还是决定写一篇随笔记录一下自己的心情,或许多年之后,我已经忘记当时的心情,但这些文字会保留下来,会见证我的成长。

小时候,或许人人都希望生日到来的那一天,因为生日的到来意味着成长,代表着长大成人,当时的自己得知自己又成长了一岁,心中确实是喜悦的;但今日的我,却没有了这份喜悦,换来的是感慨与思考。自从上大学之后,觉得时间真的好快,转眼我已经是大二下的学生,四年的大学生活已经过半,我到底做了什么,有没有成长与进步,有没有荒度这些时光,这些天我无时无刻不反问自己。我觉得我还有很多事情,很多方面需要成长,但是时间却仿佛没有这么多了,大学本科毕业那年我22岁,如果在国内读研究生,那就是3年,毕业之后我就是25岁,在我的认知里,25岁就算是开始步入中年了,而那时的我才研究生毕业初入社会,可以说是稚嫩一无所有,这是我不能接受的。所以,这也是很大一部分原因让我选择出国留学,我希望更早地步入社会,去闯去打拼,而且就我自身而言,我觉得我的性格,在社会中会更能展现出优势,而不是科研的料。希望我可以在25岁这个结点,能做到小有成就,能做到让自己满意。

再简单记录一下自己这个学期的情况,学校的课程基本要从早八上到下午三点,下课之后在图书馆学习到七点20左右,然后去吃饭,八点在健身房锻炼到9点半左右,十点多洗完澡跟好朋友玩一玩游戏到十二点左右。我秉承着德智体美劳全面发展与劳逸结合,学习不能光学书本上的知识,网上很多各种类型的视频也常常可以给我启发,学习劳累之后去运动运动把身体搞好,学就是学玩就是玩,我分的很开,所以我每天晚上多少会玩一会游戏让自己放松一下。

差不多就说到这吧,写一写随笔真的挺好的,我经常心中有很多话,仿佛构思鸿篇巨制,却常因懒惰没有记录下来,希望以后勤写勤记,加油!

未来的选择

前一阵子与很久不见的学长交谈了一阵,两个小时感觉转瞬即逝,从未来选择到现在学业,和学长的交谈总能让我醍醐灌顶。我很喜欢和优秀的人谈话,他们的想法和建议总能让我豁然开朗。我最近一直对未来的选择十分迷惘,想学的东西太多,但时间精力有限,这时候就不得不做出选择。我需要好好想想我未来到底想从事什么方向的工作,并以此为目标钻研下去,而不是像无头苍蝇一样这学一点那学一点,泛而不精的人企业是不会要的。

摆在我眼前的有三个选择,第一个,我最近一直在看前端的知识,并跟着网上的教程编点小项目实操一下,我考虑的是一方面大创需要前端,我近期就可以用得上,另一方面我学的并不是前端很深入的知识,做一个知识上的普及还是有必要的;第二个,近期又来到计算机设计大赛的时间点,我要不要重拾unity的学习,后面走unity游戏开发方向的工作呢。但其实现在这个我不考虑了;第三个,我个人对金融,投资很感兴趣,我自己又是人工智能专业,后续去香港留学也想走ai+金融的方向,我是不是应该把更多的时间用在学习ai相关呢。

学长建议我还是要把更多的时间花在ai相关的学习,现在ai正是主流方向,沿着这个方向努力肯定是不会有问题的,平时要把人工智能相关的专业课,比如机器学习等,学扎实,而且我既然打算香港读研也是这个方向,就更要把时间花在这个地方。后续我打算把手头的项目写完后,有时间就开始在网上学习相关知识。

感觉废话有点多了,特别是上大学之后,选择与方向真的太多,但不管是哪个选择,都要大步走下去,而不是犹犹豫豫原地踏步,任重而道远啊!

最后说点题外话,把能认识到像学长这样优秀的人,我着实感到十分幸运。这两天又看了看学长的博客,每次看都能让我受益良多,我能开始写博客很大部分也受他的影响,但相比之下,确实感到自惭形愧,向学长学习!

为什么要读这本书

我觉得学会投资,学会钱生钱,是一件很重要的事情,一开始这是我父亲告诉我的,后来我自身也是深刻地感受到了。投资,可以避免通货膨胀带了的损失,如果做到了一定的境界,更可以真正实现财富自由。但是想要学好投资并不是一件容易的事。投资的成功,不仅需要敏锐的洞察力与眼光,社会经验的积累,还要有一种成熟的投资心态,进而探索出适合自身的投资理念。我觉得,这是需要一件长期实践的事情,所以我决定早些开始,虽然我现在并没有什么资产,但在投资的过程中,包括看新闻看热点,去搜索去了解一家公司,这都是在锻炼我的视野,为以后做铺垫吧

习惯的力量

因为“习惯”的力量,仍然有许多人把所有的收入存放在收益率较低的“储蓄”里,让通货膨胀

vscode

代码格式化:shift+alt+f

向上或向下移动一行:Alt+Up或Alt+Down

快速开始新一行:ctrl+enter

快速复制一行代码:Shift+Alt+Up 或Shift+Alt+Down

快速保存:Ctrl +S

快速查找:Ctrl + F

快速替换:Ctrl+ H

快速移动一行 alt + ↓或↑

多光标: alt + 鼠标左键

html5

合并单元格

  • 水平合并:colspan
  • 垂直合并:rowspan

h5新标签

  1. <header></header> 头部
  2. <nav></nav> 导航
  3. <section></section>定义文档中的节,比如章节、页眉、页脚
  4. <aside></aside> 侧边栏
  5. <footer></footer> 脚部
  6. <article></article> 代表一个独立的、完整的相关内容块,例如一篇完整的论坛帖子,一篇博客文章,一个用户评论等

查漏补缺

<figure>元素表示文档流中独立的内容块。这个内容通常与主文档相关,但可以被移动到文档的其他位置(如侧边栏、脚注或独立的附件)而不会影响理解文档的其余部分。

<section>元素用于定义文档中的一个区域(section),它通常表示文档中的一个主题或内容块。

图像标题(figcaption)元素用于添加标题以描述 figure 元素中包含的图像。<figcaption> 必须是 <figure> 元素的子元素,并且它必须是 <figure> 中的第一个或最后一个子元素

“URL” 是 “Uniform Resource Locator” 的缩写,中文意思是 “统一资源定位符”。它是一种用于在互联网上定位和访问资源(如网页、图像、视频等)的地址。

fieldset 元素用于在 Web 表单中将相关的输入和标签组合在一起。 fieldset 元素是块级元素,这意味着它们出现在新的一行上。

legend 元素充当 fieldset 元素中内容的标题。 它为用户提供了应该在表单的该部分中输入什么的上下文。

<meta name="viewport" content="width=device-width, initial-scale=1.0" />是一个非常重要的 HTML 元标签,用于控制网页在移动设备上的布局和显示方式

article和section

article标签表示文档、页面、应用或网站的一部分,具有独立性和完整性。它通常包含一些内容,如新闻报道、博客文章、论坛帖子等,这些内容可以被单独地分享、链接和索引。

section标签则表示文档或应用的一部分,但不具有独立性和完整性。它通常用于组织内容,将页面或应用分成不同的部分,例如头部、主体、脚注等。

method 属性指定了如何将表单数据发送到 action 属性中指定的 URL。 表单数据可以通过 GET 请求作为 URL 参数发送(method="get")或通过 POST 请求作为请求正文中的数据发送(method="post")。

给密码 input 元素添加 pattern 属性,要求输入匹配 [a-z0-5]{8,}。上面是一个正则表达式,匹配 8 个以上的小写字母或数字 05

<select><option> 是 HTML 中用于创建下拉列表的元素

<textarea> 是 HTML 中的一个表单元素,用于多行文本输入,允许用户输入和编辑大量文本。

英文全称记忆

<ul> : “Unordered List”

<li> : “List - item”

src: “source”

css text-align: “text alignment”(文本对齐方式)

link rel:relationship

<hr>:“Horizontal Rule”

css3

查漏补缺

opacity 是 CSS 中用于控制元素透明度的属性。它可以设置一个元素的透明度级别,取值范围从 0(完全透明)到 1(完全不透明)

box-shadow 属性允许你在元素周围应用一个或多个阴影。box-shadow: offsetX offsetY blurRadius color;

linear-gradient 是 CSS 中用于创建线性渐变背景的属性。它允许你在元素的背景中定义多种颜色之间的平滑过渡效果

hsla(Hue色相, Saturation饱和度, Lightness, Alpha透明度)是一种在 CSS 中定义颜色的方式,基于 HSL(色相、饱和度、亮度)颜色模型,并且允许设置透明度(alpha 值)。

vh 是 CSS 中的一种相对长度单位,表示视口高度(Viewport Height)的百分比。具体来说,1vh 等于视口高度的 1%。视口是指浏览器窗口中可见的部分,不包括工具栏、地址栏等非内容区域。

em 是 CSS 中的一种相对单位,用于表示元素的字体大小(font-size)的倍数。具体来说,1em 等于当前元素的字体大小。例如,如果一个元素的字体大小为 16px,那么 1em 就等于 16px

rem(Root Em)是 CSS 中的一种相对单位,表示相对于根元素(html 元素)的字体大小(font-size)的倍数。

在 CSS 中,cursor 属性用于定义鼠标指针位于元素上时的形状或图标。它对于改善用户体验非常重要,因为它为用户提供了视觉反馈,让他们知道可与页面上的不同元素进行哪些操作。

z-index属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.box1{
width: 200px;
height: 200px;
background-color: red;
position:absolute;
z-index: 2;
}
.box2{
width: 300px;
height: 300px;
background-color: green;
position:absolute;
z-index: 1;
}

css3新特性

圆角

使用 CSS3 border-radius 属性,你可以给任何元素制作 “圆角”

border-radius 属性,可以使用以下规则:

  1. 四个值: 第一个值为左上角,第二个值为右上角,第三个值为右下角,第四个值为左下角
  2. 三个值: 第一个值为左上角, 第二个值为右上角和左下角,第三个值为右下角
  3. 两个值: 第一个值为左上角与右下角,第二个值为右上角与左下角
  4. 一个值: 四个圆角值相同

阴影

box-shadow 向框添加一个或多个阴影。

1
box-shadow: h-shadow v-shadow blur color;
描述
h-shadow 必选,水平阴影的位置
v-shadow 必选,垂直阴影的位置
blur 可选,模糊距离
color 可选,阴影的颜色

动画

使用@keyframes规则,你可以创建动画

1
2
3
4
5
6
7
8
9
10
11
@keyframes name {
from|0%{
css样式
}
percent{
css样式
}
to|100%{
css样式
}
}

name:动画名称,开发人员自己命名;

percent:为百分比值,可以添加多个百分比值;

animation执行动画

1
animation: name duration timing-function delay iteration-count direction;
描述
name 设置动画的名称
duration 设置动画的持续时间
timing-function 设置动画效果的速率(如下)
delay 设置动画的开始时间(延时执行)
iteration-count 设置动画循环的次数,infinite为无限次数的循环
direction 设置动画播放的方向(如下)
animation-play-state 控制动画的播放状态:running代表播放,而paused代表停止播放
timing-function值 描述
ease 逐渐变慢(默认)
linear 匀速
ease-in 加速
ease-out 减速
ease-in-out 先加速后减速
direction值 描述
normal 默认值为normal表示向前播放
alternate 动画播放在第偶数次向前播放,第奇数次向反方向播放

切换背景颜色

1
<div class="animation"></div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.animation {
width: 300px;
height: 300px;
background-color: red;
animation: anima 5s linear 5s infinite;
}
.animation:hover {
animation-play-state: paused;
}
@keyframes anima {
0% {
background-color: red;
}
50% {
background-color: green;
}
100% {
background-color: blueviolet;
}
}

设置meta标签

使用设备的宽度作为视图宽度并禁止初始的缩放。在<head>标签里加入这个meta标签。

1
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">

参数解释

  1. width = device-width 宽度等于当前设备的宽度
  2. initial-scale 初始的缩放比例(默认设置为1.0)
  3. maximum-scale 允许用户缩放到的最大比例(默认设置为1.0)
  4. user-scalable 用户是否可以手动缩放(默认设置为no)

JS

querySelector()

ES6

常用命令行工具有两种

  1. CMD 命令行工具
  2. PowerShell 命令行工具

CMD命令行

  1. 打开命令行窗口
    1. win:左下角开始,找到运行,点击,输入cmd,回车
    2. win:win+r 快速打开命令行窗口
  2. 选择盘符:盘符名加冒号E:
  3. 查看盘符及目录下文件与文件夹:win:dir
  4. 清空命令行信息:win:cls
  5. 进入文件夹或目录:cd 文件夹名称
  6. 返回到上一级目录:cd ../
  7. 快速补全目录或文件夹名称:tab
  8. 创建文件夹:mkdir 文件夹名称
  9. 查看历史输入过的命令:上下按键

PowerShell

  1. 打开方式
    1. 在开始位置搜索PowerShell打开
    2. 在对应目录按住shift+右键,打开
  2. 其他保持一直

ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现,通常场合,这两个词是可以互换的。

ECMAScript 6(以下简称 ES6)是 JavaScript 语言的标准,在 2015 年 6 月发布。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

TypeScript

为什么你应当使用 TypeScript? TS 十分钟快速入门_哔哩哔哩_bilibili

参考视频和网站推荐

【HTML+CSS+JS+Vue】比大学课程还详细的Web前端教程,整整180集,学完即可兼职就业!附学习文档PDF,随时都能学_前端开发_WEB入门_哔哩哔哩_bilibili

Learn to Code — For Free — Coding Courses for Busy People

0%