所有算法

回归和分类作为两种类型的算法,都出现回归(线性回归和逻辑回归)的算法,如何理解。
线性回归和逻辑回归的区别
线性回归:一个参数一个值(参数不断的变化,值不断的变化)。逻辑回归是基于先线性回归的基础上加一个sigmod函数的判断,得出最终的一个分类结果(0/1). 这就是线性回归和逻辑回归的区别。
线性回归例子:
import numpy as np
from sklearn.linear_model import LinearRegression
# 准备数据
X = np.array([[50], [60], [70], [80], [90], [100]]) # 面积
y = np.array([150, 180, 210, 240, 270, 300]) # 房价
# 创建并训练模型
model = LinearRegression()
model.fit(X, y)
# 查看学到的参数
print("权重 w =", model.coef_[0]) # 3.0
print("偏置 b =", model.intercept_) # 0.0
# 预测 75 平米
pred = model.predict([[75]])
print("75 平米预测房价 =", pred[0], "万元") # 225.0
逻辑回归例子:
import numpy as np
from sklearn.linear_model import LogisticRegression
# 准备数据
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8]]) # 学习时长
y = np.array([0, 0, 0, 1, 1, 1, 1, 1]) # 是否通过
# 创建并训练模型
model = LogisticRegression()
model.fit(X, y)
# 查看学到的参数
print("权重 w =", model.coef_[0][0])
print("偏置 b =", model.intercept_[0])
# 预测 3.5 小时
prob = model.predict_proba([[3.5]])[0][1]
pred = model.predict([[3.5]])[0]
print(f"3.5 小时通过概率 = {prob:.3f}")
print(f"预测类别 = {pred}")
如何理解参数中的 \*\*

prob和pred分别代表什么意思,为什么prob有两个值?

岭回归:
import numpy as np
from sklearn.linear_model import Ridge, LinearRegression
# 准备数据
X = np.array([[50, 1],
[60, 2],
[70, 3],
[80, 4],
[90, 5],
[100, 6]]) # 面积, 房龄
y = np.array([150, 180, 210, 240, 270, 300]) # 房价
# 普通线性回归
ols = LinearRegression()
ols.fit(X, y)
print("普通线性回归:")
print(" 权重 =", ols.coef_)
print(" 偏置 =", ols.intercept_)
# 岭回归
ridge = Ridge(alpha=1.0) # alpha 就是 λ
ridge.fit(X, y)
print("\n岭回归 (alpha=1.0):")
print(" 权重 =", ridge.coef_)
print(" 偏置 =", ridge.intercept_)
X_new = np.array([[75, 3]])
print("普通线性回归预测:", ols.predict(X_new)[0])
print("岭回归预测:", ridge.predict(X_new)[0])

Lasso回归:
import numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso
# 数据
X = np.array([[50, 2, 1, 3, 10],
[60, 2, 2, 5, 9],
[70, 3, 3, 8, 8],
[80, 3, 4, 10, 7],
[90, 4, 5, 12, 6],
[100, 4, 6, 15, 5],
[110, 5, 7, 18, 4],
[120, 5, 8, 20, 3],
[130, 6, 9, 22, 2],
[140, 6, 10, 25, 1]])
y = np.array([150, 180, 210, 240, 270, 300, 330, 360, 390, 420])
# 普通线性回归
ols = LinearRegression()
ols.fit(X, y)
print("普通线性回归权重:", np.round(ols.coef_, 2))
# 岭回归
ridge = Ridge(alpha=1.0)
ridge.fit(X, y)
print("岭回归权重: ", np.round(ridge.coef_, 2))
# Lasso 回归
lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
print("Lasso 权重: ", np.round(lasso.coef_, 2))
删除冗余特征的例子:
import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso, LassoCV, LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
np.random.seed(42)
# ========== 1. 生成数据 ==========
n = 200
X = pd.DataFrame({
"面积": np.random.rand(n) * 100 + 50,
"房间数": np.random.randint(1, 6, n),
"房龄": np.random.randint(0, 30, n),
"楼层": np.random.randint(1, 30, n),
"距离地铁": np.random.rand(n) * 10,
"朝向": np.random.randint(0, 4, n),
"装修年限": np.random.randint(0, 10, n),
"绿化率": np.random.rand(n),
"物业费": np.random.rand(n) * 5,
"编号": np.arange(n),
})
y = (3.0 * X["面积"] + 5.0 * X["房间数"] - 1.0 * X["房龄"]
+ 0.5 * X["楼层"] - 2.0 * X["距离地铁"]
+ np.random.randn(n) * 5)
print("=" * 50)
print("原始特征数:", X.shape[1])
# ========== 2. 手动粗筛:10 -> 8 ==========
X_8 = X.drop(columns=["编号", "朝向"])
print("粗筛后特征数:", X_8.shape[1])
# ========== 3. Lasso 细筛 ==========
X_train, X_test, y_train, y_test = train_test_split(
X_8, y, test_size=0.2, random_state=42
)
lasso_cv = LassoCV(alphas=np.logspace(-3, 2, 50), cv=5, random_state=42)
lasso_cv.fit(X_train, y_train)
lasso = Lasso(alpha=lasso_cv.alpha_).fit(X_train, y_train)
print("=" * 50)
print("Lasso 最优 alpha:", lasso_cv.alpha_)
print(pd.DataFrame({"特征": X_8.columns, "权重": lasso.coef_}))
# ========== 4. 手动删除权重为 0 的特征 ==========
selected_idx = np.where(lasso.coef_ != 0)[0]
selected_features = X_8.columns[selected_idx]
X_selected = X_8[selected_features]
print("=" * 50)
print("Lasso 保留特征:", list(selected_features))
print("最终特征数:", X_selected.shape[1])
# ========== 5. 重新训练最终模型 ==========
X_train_sel, X_test_sel, y_train_sel, y_test_sel = train_test_split(
X_selected, y, test_size=0.2, random_state=42
)
final_model = LinearRegression().fit(X_train_sel, y_train_sel)
print("=" * 50)
print("最终模型权重:")
print(pd.DataFrame({"特征": selected_features, "权重": final_model.coef_}))
print("偏置:", final_model.intercept_)
# ========== 6. 评估 ==========
mse_final = mean_squared_error(y_test_sel, final_model.predict(X_test_sel))
print("=" * 50)
print(f"最终模型测试集 MSE: {mse_final:.4f}")