Ridge回归预测模型报错求助:Expected 2D array及Y变量指定问题
解决电影票房预测模型的两个核心问题
问题1:数组重塑ValueError的原因及解决
你遇到的错误核心是给模型传的不是符合要求的训练/预测数据:
- 当前代码里
steps.fit(user_ohe, user_num)传的是字符串列表(比如["user_genre", ...]),这不是模型需要的特征数据,模型需要的是真实的样本特征值,且必须是二维结构(比如形状为(n_samples, n_features))。 - 另外,用户输入的预算、时长是字符串类型,需要先转换成数值类型。
不需要单独调用reshape(-1,1),只要把输入整理成二维结构化数据(比如Pandas DataFrame)就能解决这个问题。
问题2:Y变量(总票房)的指定方式
代码不会自动生成Y变量,你必须具备带标签的训练数据集:
- 训练模型时,需要明确传入X(所有电影特征,如类型、预算、导演等)和Y(对应的真实总票房),模型才能学习特征与票房之间的关联。
- 用户输入的是待预测的新样本,不是训练数据,只有模型训练完成后,才能用它预测新样本的票房。
修正后的完整代码示例
import pandas as pd from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.linear_model import Ridge # -------------------------- # 第一步:准备训练数据集(示例数据,实际需替换为真实电影数据) # 必须包含特征列和总票房标签列 train_data = pd.DataFrame({ "genre": ["Action", "Comedy", "Drama"], "budget": [100000000, 50000000, 20000000], "runtime": [120, 90, 110], "studio": ["Warner Bros", "Disney", "Fox"], "director": ["Nolan", "Feig", "Eastwood"], "writer": ["Smith", "Jones", "Brown"], "gross_revenue": [500000000, 200000000, 150000000] }) # 定义特征列:类别特征和数值特征 cat_features = ["genre", "studio", "director", "writer"] num_features = ["budget", "runtime"] # 定义标签列(总票房) y_train = train_data["gross_revenue"] # -------------------------- # 第二步:构建预处理管道和模型 # 预处理:类别特征独热编码,数值特征直接保留 preprocessor = ColumnTransformer( transformers=[ ("cat", OneHotEncoder(handle_unknown="ignore"), cat_features), ("num", "passthrough", num_features) ]) # 完整管道:预处理 + 回归模型(票房是连续值,用回归任务) model_pipeline = Pipeline(steps=[ ('preprocessor', preprocessor), ('regressor', Ridge()) ]) # 训练模型:传入训练特征和标签 model_pipeline.fit(train_data[cat_features + num_features], y_train) # -------------------------- # 第三步:处理用户输入并预测票房 while True: user_movie = input("Enter the name of your movie: ") user_genre = input("What is the genre of your movie? ") user_budget = float(input("What is your movie's budget? ")) # 转数值类型 user_runtime = float(input("What is your movie's runtime? ")) # 转数值类型 user_studio = input("Who is your studio partner? ") user_director = input("Who is the director of your movie? ") user_writer = input("Who is your movie's writer? ") # 将用户输入整理成二维DataFrame(模型要求二维输入) user_input = pd.DataFrame({ "genre": [user_genre], "budget": [user_budget], "runtime": [user_runtime], "studio": [user_studio], "director": [user_director], "writer": [user_writer] }) # 预测票房 predicted_gross = model_pipeline.predict(user_input) print(f"Predicted Gross Revenue for {user_movie}: ${predicted_gross[0]:,.2f}") continue_pred = input("Predict another movie? (y/n): ") if continue_pred.lower() != 'y': break
关键说明
- 训练数据:实际使用时,需要替换成包含大量真实电影数据的数据集,数据量越大,模型预测效果越好。
- 数值转换:用户输入的预算、时长必须转为数值类型,否则模型无法处理。
- 管道作用:预处理管道会自动处理类别特征的独热编码,无需手动对用户输入做额外的reshape操作。
内容的提问来源于stack exchange,提问作者chiggywiggy
相关产品推荐
相关产品推荐

